fp-lab4/lib/exdns/zone/server/loader.ex
2026-01-13 18:26:26 +03:00

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