Packages
spawn_statestores
2.0.0-RC1
2.0.0-RC9
2.0.0-RC8
2.0.0-RC7
2.0.0-RC6
2.0.0-RC5
2.0.0-RC4
2.0.0-RC3
2.0.0-RC2
2.0.0-RC14
2.0.0-RC13
2.0.0-RC12
2.0.0-RC11
2.0.0-RC10
2.0.0-RC1
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc4
1.0.0-rc3
1.0.0-rc2
1.0.0-rc16
1.0.0-rc15
1.0.0-rc14
1.0.0-rc13
1.0.0-rc1
1.0.0-rc.38
1.0.0-rc.37
1.0.0-rc.36
1.0.0-rc.35
1.0.0-rc.34
1.0.0-rc.33
1.0.0-rc.32
1.0.0-rc.31
1.0.0-rc.30
1.0.0-rc.29
1.0.0-rc.28
1.0.0-rc.27
1.0.0-rc.26
1.0.0-rc.25
1.0.0-rc.24
1.0.0-rc.23
1.0.0-rc.22
1.0.0-rc.21
1.0.0-rc.20
1.0.0-rc.19
1.0.0-rc.18
1.0.0-rc.17
1.0.0-beta1
0.6.3
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.1
0.5.0
0.5.0-rc.13
0.5.0-rc.12
0.5.0-rc.11
0.5.0-rc.10
0.5.0-rc.9
0.5.0-rc.8
0.5.0-rc.7
0.5.0-rc.6
0.5.0-rc.5
0.5.0-rc.3
0.5.0-alpha.13
0.5.0-alpha.12
0.5.0-alpha.11
0.5.0-alpha.10
0.5.0-alpha.9
0.5.0-alpha.6
0.5.0-alpha.5
0.5.0-alpha.4
0.5.0-alpha.3
0.5.0-alpha.2
0.5.0-alpha.1
0.1.0
Spawn Statestores is the storage lib for the Spawn Actors System
Current section
Files
Jump to
Current section
Files
lib/google/protobuf.ex
defmodule Google.Protobuf do
@moduledoc """
Utility functions for working with Google Protobuf structs.
"""
@doc """
Converts a `Google.Protobuf.Struct` struct to a `t:map()` recursively
converting values to their Elixir equivalents.
## Examples
iex> to_map(%Google.Protobuf.Struct{})
%{}
iex> to_map(%Google.Protobuf.Struct{
fields: %{
"key_one" => %Google.Protobuf.Value{
kind: {:string_value, "value_one"},
},
"key_two" => %Google.Protobuf.Value{
kind: {:number_value, 1234.0},
}
},
})
%{"key_one" => "value_one", "key_two" => 1234.0}
"""
@spec to_map(Google.Protobuf.Struct.t()) :: map()
def to_map(struct) do
Map.new(struct.fields, fn {k, v} ->
{k, to_map_value(v)}
end)
end
defp to_map_value(%{kind: {:null_value, :NULL_VALUE}}), do: nil
defp to_map_value(%{kind: {:number_value, value}}), do: value
defp to_map_value(%{kind: {:string_value, value}}), do: value
defp to_map_value(%{kind: {:bool_value, value}}), do: value
defp to_map_value(%{kind: {:struct_value, struct}}),
do: to_map(struct)
defp to_map_value(%{kind: {:list_value, %{values: values}}}),
do: Enum.map(values, &to_map_value/1)
@doc """
Converts a `t:map()` to a `Google.Protobuf.Struct` struct recursively
wrapping values in their `Google.Protobuf.Value` equivalents.
## Examples
iex> from_map(%{})
%Google.Protobuf.Struct{}
"""
@spec from_map(map()) :: Google.Protobuf.Struct.t()
def from_map(map) do
struct(Google.Protobuf.Struct, %{
fields:
Map.new(map, fn {k, v} ->
{to_string(k), from_map_value(v)}
end)
})
end
defp from_map_value(nil) do
struct(Google.Protobuf.Value, %{kind: {:null_value, :NULL_VALUE}})
end
defp from_map_value(value) when is_number(value) do
struct(Google.Protobuf.Value, %{kind: {:number_value, value}})
end
defp from_map_value(value) when is_binary(value) do
struct(Google.Protobuf.Value, %{kind: {:string_value, value}})
end
defp from_map_value(value) when is_boolean(value) do
struct(Google.Protobuf.Value, %{kind: {:bool_value, value}})
end
defp from_map_value(value) when is_map(value) do
struct(Google.Protobuf.Value, %{kind: {:struct_value, from_map(value)}})
end
defp from_map_value(value) when is_list(value) do
struct(Google.Protobuf.Value, %{
kind:
{:list_value,
struct(Google.Protobuf.ListValue, %{
values: Enum.map(value, &from_map_value/1)
})}
})
end
@doc """
Converts a `DateTime` struct to a `Google.Protobuf.Timestamp` struct.
Note: Elixir `DateTime.from_unix!/2` will convert units to
microseconds internally. Nanosecond precision is not guaranteed.
See examples for details.
## Examples
iex> to_datetime(%Google.Protobuf.Timestamp{seconds: 5, nanos: 0})
~U[1970-01-01 00:00:05.000000Z]
iex> one = to_datetime(%Google.Protobuf.Timestamp{seconds: 10, nanos: 100})
...> two = to_datetime(%Google.Protobuf.Timestamp{seconds: 10, nanos: 105})
...> DateTime.diff(one, two, :nanosecond)
0
"""
@spec to_datetime(Google.Protobuf.Timestamp.t()) :: DateTime.t()
def to_datetime(%{seconds: seconds, nanos: nanos}) do
DateTime.from_unix!(seconds * 1_000_000_000 + nanos, :nanosecond)
end
@doc """
Converts a `Google.Protobuf.Timestamp` struct to a `DateTime` struct.
## Examples
iex> from_datetime(~U[1970-01-01 00:00:05.000000Z])
%Google.Protobuf.Timestamp{seconds: 5, nanos: 0}
"""
@spec from_datetime(DateTime.t()) :: Google.Protobuf.Timestamp.t()
def from_datetime(%DateTime{} = datetime) do
nanoseconds = DateTime.to_unix(datetime, :nanosecond)
struct(Google.Protobuf.Timestamp, %{
seconds: div(nanoseconds, 1_000_000_000),
nanos: rem(nanoseconds, 1_000_000_000)
})
end
end