Packages
protox
1.6.1
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-dev
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
retired
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
A fast, easy to use and 100% conformant Elixir library for Google Protocol Buffers (aka protobuf)
Current section
Files
Jump to
Current section
Files
lib/google/protobuf/timestamp.ex
defimpl Protox.JsonMessageDecoder, for: Google.Protobuf.Timestamp do
def decode_message(_initial_message, nil), do: nil
def decode_message(initial_message, json) do
if not String.contains?(json, "T") do
raise Protox.JsonDecodingError.new("Missing 'T' in timestamp")
end
date_time =
case DateTime.from_iso8601(json) do
{:ok, dt, _offset} ->
dt
_ ->
raise Protox.JsonDecodingError.new(
"invalid timestamp (format or greater than 9999-12-31T23:59:59.999999999Z)"
)
end
unix_timestamp = DateTime.to_unix(date_time, :nanosecond)
# 0001-01-01T00:00:00Z as UNIX date in nanoseconds
if unix_timestamp < -62_135_596_800_000_000_000 do
raise Protox.JsonDecodingError.new("timestamp is < 0001-01-01T00:00:00Z")
else
nanos = rem(unix_timestamp, 1_000_000_000)
seconds = div(unix_timestamp, 1_000_000_000)
struct!(initial_message, seconds: seconds, nanos: nanos)
end
end
end
defimpl Protox.JsonMessageEncoder, for: Google.Protobuf.Timestamp do
def encode_message(msg, json_encode) do
unix_timestamp = msg.seconds * 1_000_000_000 + msg.nanos
cond do
# 9999-12-31T23:59:59.999999999Z as UNIX date in nanoseconds
unix_timestamp > 253_402_300_799_999_999_000 ->
raise Protox.JsonEncodingError.new("{msg.__struct__} is > 9999-12-31T23:59:59.999999999Z")
# 0001-01-01T00:00:00Z as UNIX date in nanoseconds
unix_timestamp < -62_135_596_800_000_000_000 ->
raise Protox.JsonEncodingError.new("{msg.__struct__} is < 0001-01-01T00:00:00Z")
true ->
unix_timestamp
|> DateTime.from_unix!(:nanosecond)
|> DateTime.to_iso8601()
|> json_encode.()
end
end
end