Current section

Files

Jump to
rustq lib rustq config state.ex
Raw

lib/rustq/config/state.ex

defmodule RustQ.Config.State do
@moduledoc """
Process-local state and rendering helpers used by the `RustQ.Config` DSL.
"""
def start, do: Process.put(:rustq_config_targets, [])
def delete, do: Process.delete(:rustq_config_targets)
def finish do
Process.get(:rustq_config_targets, [])
end
def manifest, do: [generated: Process.get(:rustq_config_targets, [])]
def start_target(name, path) do
ensure_started()
Process.put(:rustq_config_target, {name, [path: path]})
end
def put_target(name, path, opts) do
ensure_started()
targets = Process.get(:rustq_config_targets, [])
Process.put(:rustq_config_targets, [{name, Keyword.put(opts, :path, path)} | targets])
end
def put_rust_items(name, path, items) do
put_target(
name,
path,
build: fn -> render_rust_items(path, items: items) end
)
manifest()
end
def target_name(path) do
path
|> Path.basename(Path.extname(path))
|> String.replace_prefix("generated_", "")
end
def module_from_path(path) do
segments =
path
|> Path.rootname()
|> String.split("/")
|> Enum.drop_while(&(&1 in ["lib", "test", "support"]))
|> Enum.map(&Macro.camelize/1)
case segments do
[] -> nil
segments -> Module.concat(segments)
end
end
def put_target_option(key, value) do
{name, target} = Process.get(:rustq_config_target)
Process.put(:rustq_config_target, {name, Keyword.put(target, key, value)})
end
def finish_target do
{name, target} = Process.delete(:rustq_config_target)
targets = Process.get(:rustq_config_targets, [])
Process.put(:rustq_config_targets, [{name, target} | targets])
:ok
end
def render_rust_items(path, opts) do
items = opts |> Keyword.fetch!(:items) |> List.wrap() |> List.flatten()
opts = Keyword.put(opts, :splice, items: items)
render("__rq_items!();", Keyword.put(opts, :filename, Path.basename(path)))
end
def render(template, opts) do
filename = Keyword.get(opts, :filename, "rustq_generated.rs")
render_opts =
opts
|> Keyword.delete(:filename)
|> expand_preamble()
RustQ.render!(template, filename, render_opts)
end
defp ensure_started do
unless Process.get(:rustq_config_targets) do
start()
end
end
defp expand_preamble(opts) do
case Keyword.get(opts, :preamble, :rustq) do
:rustq ->
Keyword.put(
opts,
:preamble,
"// This file is generated by RustQ. Do not edit by hand.\n\n"
)
_other ->
opts
end
end
end