Current section
Files
Jump to
Current section
Files
lib/phoenix_test/playwright/serialization.ex
defmodule PhoenixTest.Playwright.Serialization do
@moduledoc false
require Logger
def serialize(nil) do
%{value: %{v: "undefined"}, handles: []}
end
def deserialize({:ok, value}) do
deserialize(value)
end
def deserialize(value) when is_map(value) do
case value do
%{a: list} ->
Enum.map(list, &deserialize/1)
%{b: boolean} ->
boolean
%{n: number} ->
number
%{o: object} ->
object
|> Map.new(fn item -> {item.k, deserialize(item.v)} end)
|> deep_atomize_keys()
%{s: string} ->
string
%{v: "null"} ->
nil
%{v: "undefined"} ->
nil
%{ref: _} ->
:ref_not_resolved
end
end
def deserialize(value) when is_list(value) do
Enum.map(value, &deserialize(&1))
end
defp deep_atomize_keys(map) when is_map(map) do
Map.new(map, fn
{k, v} when is_map(v) ->
{to_atom(k), deep_atomize_keys(v)}
{k, list} when is_list(list) ->
{to_atom(k), Enum.map(list, fn v -> deep_atomize_keys(v) end)}
{k, v} ->
{to_atom(k), v}
end)
end
defp deep_atomize_keys(other), do: other
defp to_atom(nil), do: raise(ArgumentError, message: "Unable to convert nil into an atom")
defp to_atom(s) when is_binary(s), do: String.to_atom(s)
defp to_atom(a) when is_atom(a), do: a
end