75 lines
1.6 KiB
Elixir
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
|