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