defmodule TradeMachine.GMGradeV2.Pillars.AssetManagement.JSONSafe do @moduledoc false @doc "Recursively converts scoring diagnostics to values accepted by Jason/jsonb." def value(%Range{} = range), do: %{first: range.first, last: range.last, step: range.step} def value(%Date{} = date), do: Date.to_iso8601(date) def value(%DateTime{} = datetime), do: DateTime.to_iso8601(datetime) def value(%NaiveDateTime{} = datetime), do: NaiveDateTime.to_iso8601(datetime) def value(tuple) when is_tuple(tuple), do: tuple |> Tuple.to_list() |> Enum.map(&value/1) def value(list) when is_list(list), do: Enum.map(list, &value/1) def value(%_{} = struct) do struct |> Map.from_struct() |> Map.drop([:__meta__]) |> value() end def value(map) when is_map(map), do: Map.new(map, fn {key, item} -> {key, value(item)} end) def value(other), do: other end