# `Protox.Types`
[🔗](https://github.com/ahamez/protox/blob/main/lib/protox/types.ex#L1)

This module describes the types that define a protobuf message.

See https://developers.google.com/protocol-buffers/docs/encoding#structure.

# `label`

```elixir
@type label() :: :none | :optional | :proto3_optional | :repeated | :required | nil
```

This type gives more information on the field presence (if applicable).

# `map_key`

```elixir
@type map_key() ::
  :int32
  | :int64
  | :uint32
  | :uint64
  | :sint32
  | :sint64
  | :fixed32
  | :fixed64
  | :sfixed32
  | :sfixed64
  | :bool
  | :string
```

All types that can be used as a key in a map field.

# `tag`

```elixir
@type tag() :: wire_varint() | wire_64bits() | wire_delimited() | wire_32bits()
```

The wire type of a field: it tells how a field is encoded (32 or 64 bits scalar, repeated or
variable-length integer).

# `type`

```elixir
@type type() ::
  :fixed32
  | :sfixed32
  | :float
  | :fixed64
  | :sfixed64
  | :double
  | :int32
  | :uint32
  | :sint32
  | :int64
  | :uint64
  | :sint64
  | :bool
  | :string
  | :bytes
  | {:enum, atom()}
  | {:message, atom()}
  | {map_key(), type()}
```

All the types that can be stored in a protobuf message.

# `wire_32bits`

```elixir
@type wire_32bits() :: 5
```

32 bits scalar.

# `wire_64bits`

```elixir
@type wire_64bits() :: 1
```

64 bits scalar.

# `wire_delimited`

```elixir
@type wire_delimited() :: 2
```

Repeated field.

# `wire_varint`

```elixir
@type wire_varint() :: 0
```

Variable length integer.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
