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

This module provides a helper function to merge messages.

When merging, unknown fields from both input messages are concatenated and
kept as-is. Duplicates are preserved; no deduplication is performed.

# `merge`

```elixir
@spec merge(struct() | nil, struct() | nil) :: struct() | nil
```

Singular fields of `msg` will be overwritten, if specified in `from`, except for
embedded messages which will be merged. Repeated fields will be concatenated.

Note that "specified" has a different meaning in protobuf 2 and 3:
- 2: if the singular field from `from` is nil, the value from `msg` is kept
- 3: if the singular field from `from` is set to the default value, the value from `msg` is
kept. This behaviour matches the C++ reference implementation behaviour.

- `msg` and `from` must be of the same type; or
- either `msg` or `from` is `nil`: the non-nil message is returned; or
- both are `nil`: `nil` is returned

# Example
    iex> r1 = %Protobuf2Message{a: 0, b: :ONE}
    iex> r2 = %Protobuf2Message{a: nil, b: :TWO}
    iex> Protox.MergeMessage.merge(r1, r2)
    %Protobuf2Message{a: 0, b: :TWO}
    iex> Protox.MergeMessage.merge(r2, r1)
    %Protobuf2Message{a: 0, b: :ONE}

---

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