portingtools/lib/portingtools/mappings/agent.ex
2022-10-31 22:08:43 +01:00

75 lines
1.6 KiB
Elixir

defmodule PortingTools.Mappings.Agent do
@moduledoc """
This module manages and loads the mappings
and renames.
"""
use Agent, restart: :transient
require Logger
def start_link(_) do
Agent.start_link(&init/0, name: __MODULE__)
end
defmodule PortingTools.Mappings.Agent.State do
defstruct [:mappings, :renames]
end
def init() do
%PortingTools.Mappings.Agent.State{
mappings: load_mappings(),
renames: load_renames()
}
end
def load_mappings() do
Logger.info("reading mappings")
mappings =
File.ls!("mappings")
|> Stream.flat_map(&File.stream!("mappings/#{&1}"))
|> Stream.map(&String.split(&1, ","))
|> Enum.reduce(%{}, fn [remapped, orig | _], map ->
Map.put(map, String.trim(remapped), String.trim(orig))
end)
Logger.info("read #{map_size(mappings)} mappings")
mappings
end
def load_renames() do
Logger.info("reading renames")
renames =
File.stream!("renames.csv")
|> Stream.map(&String.split(&1, ","))
|> Enum.reduce(%{}, fn [old, new | _], map ->
Map.put(map, String.trim(old), String.trim(new))
end)
Logger.info("read #{map_size(renames)} renames")
renames
end
def map(key) do
mapping = Agent.get(__MODULE__, &Map.get(&1.mappings, key))
case mapping do
nil ->
Logger.warn("tried to map unknown symbol")
nil
m ->
case Agent.get(__MODULE__, &Map.get(&1.renames, m)) do
nil ->
m
r ->
Logger.info("found rename for #{m} -> #{r}")
r
end
end
end
end