Current section
Files
Jump to
Current section
Files
lib/rustq/rust/ast/node_dsl.ex
defmodule RustQ.Rust.AST.NodeDSL do
@moduledoc """
Defines RustQ AST node modules with schema metadata and typed structs.
"""
defmacro defnode(name, category, fields, opts \\ []) do
type_ast = opts |> Keyword.fetch!(:type) |> quoted_type_ast()
quote do
defmodule unquote(name) do
@moduledoc """
RustQ AST node generated by `RustQ.Rust.AST.NodeDSL.defnode/4`.
"""
defstruct unquote(fields)
@rustq_ast_category unquote(category)
def __rustq_ast_category__, do: @rustq_ast_category
@type t :: unquote(type_ast)
end
end
end
defp quoted_type_ast({:quote, _meta, [[do: ast]]}), do: ast
defp quoted_type_ast(ast), do: ast
end