Current section

Files

Jump to
instream lib instream connection response_parser_v1.ex
Raw

lib/instream/connection/response_parser_v1.ex

defmodule Instream.Connection.ResponseParserV1 do
@moduledoc false
alias Instream.Connection.JSON
alias Instream.Decoder.CSV
alias Instream.HTTPClient
@doc """
Parses a response.
"""
@spec maybe_parse(HTTPClient.response(), module, Keyword.t()) :: any
def maybe_parse({:error, _} = error, _, _), do: error
def maybe_parse({:ok, _, _, ""}, _, _), do: :ok
def maybe_parse({:ok, status, headers, body}, conn, opts)
when 300 <= status do
if content_type_contains?("json", headers) do
maybe_decode_json(body, conn, opts)
else
maybe_wrap_error(body, opts)
end
end
def maybe_parse({:ok, _, headers, body}, conn, opts) do
cond do
content_type_contains?("csv", headers) -> maybe_decode_csv(body, opts)
content_type_contains?("json", headers) -> maybe_decode_json(body, conn, opts)
true -> body
end
end
defp content_type_contains?(type_part, headers) do
case HTTPClient.Headers.find("content-type", headers) do
nil -> false
val -> String.contains?(val, type_part)
end
end
defp maybe_decode_csv(response, opts) do
case opts[:result_as] do
:raw -> response
_ -> CSV.parse(response)
end
end
defp maybe_decode_json(response, conn, opts) do
case opts[:result_as] do
:raw -> response
_ -> JSON.decode(response, conn)
end
end
defp maybe_wrap_error(error, opts) do
error = String.trim(error)
case opts[:result_as] do
:raw -> error
_ -> %{error: error}
end
end
end