Packages

Elixir implementation of SCRC Client and Server

Current section

Files

Jump to
scrc lib scrc data_clipper.ex
Raw

lib/scrc/data_clipper.ex

defmodule Scrc.DataClipper do
# This is the DataClipper module. It implements clipping of SCRC data according to field specifications.
@moduledoc false
@doc """
Clip the provided payload according to the field specifications.
"""
@spec clip(struct, Scrc.Mapper.payload_fields) :: struct
def clip(%_{} = payload, payload_fields) do
clipped_fields = payload_fields
|> Enum.map(fn field -> clip_payload_field(payload, field) end)
|> Enum.into(%{})
Map.merge(payload, clipped_fields)
end
defp do_clip(value, list) when is_list(list) do
if value in list, do: value, else: nil
end
defp do_clip(value, range) when is_tuple(range) do
{min, max} = range
min(max, max(min, value))
end
defp clip_payload_field(%_{} = payload, field) do
{_name, key, _type, opts} = field
value = clip_opts(Map.get(payload, key), opts)
{key, value}
end
defp clip_opts(value, []) do
value
end
defp clip_opts(value, [{:clip, range_or_list} | t]) do
value
|> do_clip(range_or_list)
|> clip_opts(t)
end
defp clip_opts(value, [{:default, default} | t]) do
clip_opts((if value == nil, do: default, else: value), t)
end
defp clip_opts(_value, [{key, _} | _t]) do
raise(ArgumentError, "unknown option key '#{key}'")
end
end