lib/geocoder/json_codec/jsx.ex

defmodule Geocoder.JSONCodec.JSX do
  @moduledoc """
  Implementation of the codec for the JSX library
  """

  @behaviour Geocoder.JSONCodec

  if Code.ensure_loaded?(:jsx) do
    def encode!(%{} = map) do
      map |> :jsx.encode()
    end

    def decode!(string) do
      :jsx.decode(string, [:return_maps])
    end
  else
    def encode!(_) do
      raise ":jsx must be added as a dependency to use this module"
    end

    def decode!(_) do
      raise ":jsx must be added as a dependency to use this module"
    end
  end

  def encode(map) do
    {:ok, encode!(map)}
  rescue
    ArgumentError -> {:error, :badarg}
  end

  def decode(string) do
    {:ok, decode!(string)}
  rescue
    ArgumentError -> {:error, :badarg}
  end
end