Current section

Files

Jump to
protox lib google protobuf list_value.ex
Raw

lib/google/protobuf/list_value.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#listvalue
defmodule Protox.Google.Protobuf.ListValue do
@moduledoc false
use Protox.Define,
enums: [],
messages: [
{
Google.Protobuf.ListValue,
:proto3,
[
Protox.Field.new!(
kind: :unpacked,
label: :repeated,
name: :values,
tag: 1,
type: {:message, Google.Protobuf.Value}
)
]
}
]
end
defimpl Protox.JsonMessageDecoder, for: Google.Protobuf.ListValue do
def decode_message(initial_message, value) when is_list(value) do
values =
Enum.map(value, fn entry ->
Protox.JsonMessageDecoder.decode_message(%Google.Protobuf.Value{}, entry)
end)
struct!(initial_message, values: values)
end
def decode_message(_initial_message, _value) do
raise Protox.JsonDecodingError.new("invalid ListValue")
end
end
defimpl Protox.JsonMessageEncoder, for: Google.Protobuf.ListValue do
def encode_message(%Google.Protobuf.ListValue{} = msg, json_encode) do
json_list =
msg.values
|> Stream.map(&Protox.JsonMessageEncoder.encode_message(&1, json_encode))
|> Enum.join(",")
["[", json_list, "]"]
end
end