Packages

A collection of utilities for working with Thrift in Elixir. Provides a copy of the Apache Thrift Erlang runtime.

Current section

Files

Jump to
thrift lib parser resolver.ex
Raw

lib/parser/resolver.ex

defmodule Thrift.Parser.Resolver do
@moduledoc """
A resolver for references.
During file parsing, all new generated thrift concepts flow through this resolver
and are added to its global database of names. At the end, the database is dumped into
the FileGroup so it can resolve references.
"""
alias Thrift.Parser.ParsedFile
def start_link do
Agent.start_link(&Map.new/0, name: __MODULE__)
end
def stop do
Agent.stop(__MODULE__)
end
def add(%ParsedFile{} = f) do
Agent.update(__MODULE__, fn(state) ->
state
|> update(f.name, f.schema.services)
|> update(f.name, f.schema.structs)
|> update(f.name, f.schema.exceptions)
|> update(f.name, f.schema.unions)
|> update(f.name, f.schema.enums)
end)
end
def get do
Agent.get(__MODULE__, &(&1))
end
defp update(%{} = state, include_name, %{} = local_mappings) do
new_mappings = local_mappings
|> Map.new(fn {name, val} ->
{:"#{include_name}.#{name}", Map.put(val, :name, :"#{include_name}.#{name}")}
end)
Map.merge(state, new_mappings)
end
end