32 lines
818 B
Elixir
32 lines
818 B
Elixir
defmodule Exdns.HttpCodec do
|
|
@moduledoc false
|
|
|
|
alias Exdns.HttpCodec.Record
|
|
|
|
def name_from_string(name) do
|
|
name
|
|
|> String.trim(".")
|
|
|> String.split(".", trim: true)
|
|
end
|
|
|
|
def name_to_string(labels) when is_list(labels), do: Enum.join(labels, ".")
|
|
|
|
def decode_records(%{"records" => records}, zone_name) when is_list(records) do
|
|
records
|
|
|> Enum.reduce_while([], fn record, acc ->
|
|
case Record.decode(record, zone_name) do
|
|
{:ok, rr} -> {:cont, [rr | acc]}
|
|
{:error, reason} -> {:halt, {:error, reason}}
|
|
end
|
|
end)
|
|
|> case do
|
|
{:error, _} = error -> error
|
|
list -> {:ok, Enum.reverse(list)}
|
|
end
|
|
end
|
|
|
|
def decode_records(_, _zone_name), do: {:error, "invalid_body"}
|
|
|
|
def encode_records(records), do: Enum.map(records, &Record.encode/1)
|
|
end
|