Current section
Files
Jump to
Current section
Files
lib/stable_jason.ex
defmodule StableJason do
@moduledoc """
Encoder of Elixir values to a stable JSON.
"""
alias StableJason.Encoder
@doc """
Generates stable JSON corresponding to `input`.
`opts` are the same as `Jason.encode/2`.
## Example
iex> StableJason.encode(%{c: 3, b: 2, a: 1})
{:ok, ~S|{"a":1,"b":2,"c":3}|}
iex> StableJason.encode(%{c: 3, b: 2, a: 1}, sorter: :desc)
{:ok, ~S|{"c":3,"b":2,"a":1}|}
iex> StableJason.encode(<<0::1>>)
{:error,
%Protocol.UndefinedError{
protocol: Jason.Encoder,
value: <<0::size(1)>>,
description: "cannot encode a bitstring to JSON"
}}
"""
def encode(input, opts \\ []) do
{sorter, opts} = Keyword.pop(opts, :sorter)
case Encoder.encode(input, sorter || :asc) do
{:ok, result} -> Jason.encode(result, opts)
{:error, error} -> {:error, error}
end
end
@doc """
Generates stable JSON corresponding to `input`.
Similar to `encode/2` except it will unwrap the error tuple and raise
in case of errors.
## Examples
iex> StableJason.encode!(%{a: 1})
~S|{"a":1}|
iex> StableJason.encode!(%{a: 1, b: 3}, sorter: :desc)
~S|{"b":3,"a":1}|
iex> StableJason.encode!("\\xFF")
** (Jason.EncodeError) invalid byte 0xFF in <<255>>
"""
def encode!(input, opts \\ []) do
{sorter, opts} = Keyword.pop(opts, :sorter)
case Encoder.encode(input, sorter || :asc) do
{:ok, result} -> Jason.encode!(result, opts)
{:error, error} -> raise error
end
end
end