# `Trogon.Commanded.ProtobufMapper`
[🔗](https://github.com/straw-hat-team/beam-monorepo/blob/trogon_commanded@v1.0.1/apps/trogon_commanded/lib/trogon/commanded/protobuf_mapper.ex#L2)

Protocol for encoding and decoding `Protobuf` structs.

The protocol is required when using the `Trogon.Commanded.EventStore.ProtobufJsonbSerializer` serializer and
working with Aggregate snapshotting. Since the Aggregates are not `Protobuf` structs, the serializer needs to
encode and decode them to a `Protobuf` struct.

## Example

```elixir
defmodule MyApp.MyAggregate do
  alias MyApp.Proto.MyAggregateProto

  use Trogon.Commanded.Aggregate, identifier: :id

  embedded_schema do
    field(:initiated?, :boolean, default: false)
  end
end

defimpl Trogon.Commanded.ProtobufMapper, for: MyApp.MyAggregate do
  alias MyApp.MyAggregate
  alias MyApp.Proto.MyAggregateProto

  def message_module(%MyAggregate{} = _aggregate), do: MyAggregateProto

  def to_proto_message(%MyAggregate{} = aggregate) do
    %MyAggregateProto{
      id: aggregate.id,
      initiated: aggregate.initiated?
    }
  end

  def from_proto_message(%MyAggregate{} = aggregate, %MyAggregateProto{} = proto_message) do
    aggregate
    |> Map.put(:id, proto_message.id)
    |> Map.put(:initiated?, proto_message.initiated)
  end
end
```

# `t`

```elixir
@type t() :: term()
```

All the types that implement this protocol.

# `from_proto_message`

Given the initial message, and the decoded `Protobuf` struct, returns the decoded term.

The default implementation returns the decoded term itself because implicitly expects the initial message to be a
`Protobuf` struct. No need to map the decoded term to the initial message.

# `proto_module`

Returns the module name of the `Protobuf` struct.

The default implementation returns the struct name of the message because implicitly expects the struct to be a
`Protobuf` struct. No need to map the struct to the message.

# `to_proto_message`

Given a struct, returns a `Protobuf` struct.

The default implementation returns the message itself because implicitly expects the struct to be a
`Protobuf` struct. No need to map the struct to the message.

---

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