48 lines
1.0 KiB
Elixir
48 lines
1.0 KiB
Elixir
defmodule Exdns.ZoneServer.Loader do
|
|
@moduledoc false
|
|
|
|
alias Exdns.ZoneStorage
|
|
|
|
def load_zone(state, name) do
|
|
case Map.fetch(state.zone, name) do
|
|
{:ok, records} ->
|
|
{:ok, records, state}
|
|
|
|
:error ->
|
|
case ZoneStorage.read(name) do
|
|
{:ok, records} ->
|
|
zone = Map.put(state.zone, name, records)
|
|
{:ok, records, %{state | zone: zone}}
|
|
|
|
_ ->
|
|
:error
|
|
end
|
|
end
|
|
end
|
|
|
|
def load_suffixes(zone, labels) do
|
|
labels
|
|
|> suffixes()
|
|
|> Enum.reduce({zone, false}, fn name, {acc, loaded} ->
|
|
maybe_load_zone(acc, loaded, name)
|
|
end)
|
|
end
|
|
|
|
defp maybe_load_zone(zone, loaded, name) do
|
|
if Map.has_key?(zone, name) do
|
|
{zone, loaded}
|
|
else
|
|
case ZoneStorage.read(name) do
|
|
{:ok, records} -> {Map.put(zone, name, records), true}
|
|
_ -> {zone, loaded}
|
|
end
|
|
end
|
|
end
|
|
|
|
defp suffixes(labels) when is_list(labels) do
|
|
labels
|
|
|> Enum.with_index()
|
|
|> Enum.map(fn {_item, index} -> Enum.drop(labels, index) end)
|
|
end
|
|
end
|