Current section

Files

Jump to
xcribe lib content_decoder.ex
Raw

lib/content_decoder.ex

defmodule Xcribe.ContentDecoder do
@moduledoc false
alias Xcribe.ContentDecoder.UnknownType
alias Xcribe.JSON
@json_format_regex ~r{application\/json|application\/vnd\..*json}
@text_plain_format_regex ~r{text\/plain}
@doc """
Decode value by the given content_type.
iex> ContentDecoder.decode!("{\"key\":\"value\"}", "application/json")
%{"key" => "value"}
An UnknownType excption is raised when given content_type is unknown.
"""
def decode!(value, content_type) do
content_type
|> define_format()
|> decode_for(value)
end
defp decode_for(:json, value), do: JSON.decode!(value)
defp decode_for(:string, value), do: to_string(value)
defp define_format(content_type) do
cond do
is_json?(content_type) -> :json
is_text_plain?(content_type) -> :string
true -> raise UnknownType, content_type
end
end
defp is_json?(type), do: Regex.match?(@json_format_regex, type)
defp is_text_plain?(type), do: Regex.match?(@text_plain_format_regex, type)
end