defmodule Jido.Chat.Wire do
@moduledoc false
@spec to_plain(term()) :: term()
def to_plain(%DateTime{} = value), do: DateTime.to_iso8601(value)
def to_plain(%NaiveDateTime{} = value), do: NaiveDateTime.to_iso8601(value)
def to_plain(%MapSet{} = value), do: value |> Enum.to_list() |> Enum.map(&to_plain/1)
def to_plain(%Regex{} = value) do
%{"source" => value.source, "opts" => Regex.opts(value)}
end
def to_plain(%_{} = struct) do
struct
|> Map.from_struct()
|> to_plain()
end
def to_plain(map) when is_map(map) do
map
|> Enum.reject(fn {key, _value} -> key == :__struct__ or key == "__struct__" end)
|> Enum.map(fn {key, value} -> {normalize_key(key), to_plain(value)} end)
|> Map.new()
end
def to_plain(list) when is_list(list), do: Enum.map(list, &to_plain/1)
def to_plain(tuple) when is_tuple(tuple), do: tuple |> Tuple.to_list() |> Enum.map(&to_plain/1)
def to_plain(value), do: value
@spec encode_module(module() | atom() | nil) :: String.t() | nil
def encode_module(nil), do: nil
def encode_module(module) when is_atom(module), do: Atom.to_string(module)
@spec decode_module(module() | String.t() | nil) :: module() | nil
def decode_module(nil), do: nil
def decode_module(module) when is_atom(module), do: module
def decode_module(module_name) when is_binary(module_name) do
module =
module_name
|> String.trim_leading("Elixir.")
|> String.split(".")
|> Module.concat()
module
end
defp normalize_key(key) when is_atom(key), do: Atom.to_string(key)
defp normalize_key(key), do: key
end