Protox.MergeMessage (Protox v2.0.4)

Copy Markdown View Source

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.

Summary

Functions

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

Functions

merge(msg, from)

@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}