Current section

Files

Jump to
protox lib google protobuf struct.ex
Raw

lib/google/protobuf/struct.ex

# Proto definition
# https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/struct.proto
# JSON encoding
# https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#struct
defmodule Protox.Google.Protobuf.Struct do
@moduledoc false
use Protox.Define,
enums: [],
messages: [
{
Google.Protobuf.Struct,
:proto3,
[
Protox.Field.new!(
kind: :map,
label: nil,
name: :fields,
tag: 1,
type: {:string, {:message, Google.Protobuf.Value}}
)
]
}
]
end
defimpl Protox.JsonMessageDecoder, for: Google.Protobuf.Struct do
def decode_message(initial_message, value) when is_map(value) do
fields =
value
|> Stream.map(fn {key, value} when is_binary(key) ->
{key, Protox.JsonMessageDecoder.decode_message(%Google.Protobuf.Value{}, value)}
end)
|> Enum.into(%{})
struct!(initial_message, fields: fields)
end
end
defimpl Protox.JsonMessageEncoder, for: Google.Protobuf.Struct do
def encode_message(%Google.Protobuf.Struct{} = msg, json_encode) do
json_map =
msg.fields
|> Stream.map(fn {key, value} ->
encoded_value = Protox.JsonMessageEncoder.encode_message(value, json_encode)
"\"#{key}\": #{encoded_value}"
end)
|> Enum.join(",")
["{", json_map, "}"]
end
end