# Protobuf → Component
> Note: This mapping is currently only meant for the `proto3` language, though it could be adapted to `proto2`.
## Scalar Value Types
[Protobuf Reference](https://developers.google.com/protocol-buffers/docs/proto3#scalar)
| Protobuf | WIT
| - | -
| `float` | `float32`
| `double` | `float64`
| `int32` `sint32` `sfixed32` | `s32`
| `int64` `sint64` `sfixed64` | `s64`
| `uint32` `fixed32` | `u32`
| `uint64` `fixed64` | `u64`
| `bool` | `bool`
| `string` | `string`
| `bytes` | `list<u8>`
## Enums
Enums are mapped to WIT `variant`s. Each enum constant name is mapped to a variant case. Additionally, an extra case is defined with payload type `i32` to store unknown enum values, e.g. `unknown-value(i32)`
> TODO: Decide on a standard "unknown value" case name and how to resolve name collisions.
> TODO: Consider generating functions to convert between enum constant and variant values.
## Messages
Messages are mapped to WIT `record`s.
Message names are mapped to kebab-case for the record name.
> TBD: nested message name scoping
Fields are mapped in order of increasing tag number. Field names are mapped by converting to kebab-case.
An `optional` field is mapped by wrapping its type with `option<...>`.
A `repeated` field is mapped by wrapping its type with `list<...>`.
A `oneof` is mapped to a WIT `variant`. The first case of the variant is `unset`, and the other cases correspond to the fields of the `oneof`.
> TBD: what if one of the fields is named `unset`?
A `map<K,V>` is mapped (!) to a WIT `list<tuple<K, V>>`.