defmodule HTMLBuilder do alias HTMLBuilder.Encoder @spec encode(Encoder.t, Keyword.t) :: {:ok, iodata} | {:ok, String.t} | {:error, {:invalid, any}} def encode(value, options \\ []) do {:ok, encode!(value, options)} rescue exception in [Poison.EncodeError] -> {:error, {:invalid, exception.value}} end @spec encode_to_iodata(Encoder.t, Keyword.t) :: {:ok, iodata} | {:error, {:invalid, any}} def encode_to_iodata(value, options \\ []) do encode(value, [iodata: true] ++ options) end @spec encode!(Encoder.t, Keyword.t) :: iodata | no_return def encode!(value, options \\ []) do options = Enum.into(options, %{}) iodata = Encoder.encode(value, options) unless options[:iodata] do iodata |> IO.iodata_to_binary else iodata end end @spec encode_to_iodata!(Encoder.t, Keyword.t) :: iodata | no_return def encode_to_iodata!(value, options \\ []) do encode!(value, [iodata: true] ++ options) end end