Current section
Files
Jump to
Current section
Files
deps/ex_doc/lib/ex_doc/utils/simple_json.ex
defmodule ExDoc.Utils.SimpleJSON do
# We want to minimize the number of dependencies
# ExDoc has, because we don't want someone to be allowed
# to not upgrade their app due to an ExDoc restriction,
# so we ship with a simple JSON implementation.
@moduledoc false
@doc """
Encodes the given data to JSON in iodata form.
"""
def encode(nil), do: "null"
def encode(true), do: "true"
def encode(false), do: "false"
def encode(map) when is_map(map) do
mapped =
intersperse_map(Map.to_list(map), ?,, fn {key, value} ->
[key |> Atom.to_string() |> inspect(), ?:, encode(value)]
end)
[?{, mapped, ?}]
end
def encode(list) when is_list(list) do
mapped = intersperse_map(list, ?,, &encode/1)
[?[, mapped, ?]]
end
def encode(atom) when is_atom(atom) do
atom |> Atom.to_string() |> inspect()
end
def encode(binary) when is_binary(binary) do
inspect(binary, printable_limit: :infinity)
end
def encode(integer) when is_integer(integer) do
Integer.to_string(integer)
end
defp intersperse_map(list, separator, mapper, acc \\ [])
defp intersperse_map([], _separator, _mapper, acc),
do: acc
defp intersperse_map([elem], _separator, mapper, acc),
do: [acc | mapper.(elem)]
defp intersperse_map([elem | rest], separator, mapper, acc),
do: intersperse_map(rest, separator, mapper, [acc, mapper.(elem), separator])
end