Rust template quasiquoting and code generation.
RustQ renders real Rust templates from Elixir. Parse a template, bind placeholder identifiers/expressions, splice Rust fragments, then generate formatted Rust source.
The most common entry points are:
render!/3for one-shot rendering from a string template.render_file!/2for.rstemplate files.parse!/2,bind/2,splice/3, andcodegen!/2for pipeline-style codegen.parse_fragment!/2andvalid_fragment?/2for validating generated snippets.
Use RustQ.Rust for Rust fragment builders, RustQ.Rustler for Rustler code
generators, and RustQ.Config plus mix rustq.gen for project-level generated
files.
Summary
Functions
Binds Rust placeholders in a parsed template.
Generates formatted Rust source from a parsed template.
Like codegen/2, but raises on errors.
Reads and parses a Rust template file.
Like from_file/1, but returns the template directly or raises on errors.
Parses and validates a Rust template.
Like parse/2, but returns the template directly or raises on errors.
Parses and validates a Rust fragment for a specific context.
Like parse_fragment/2, but returns the fragment directly or raises on errors.
Like render/3, but raises on errors.
Renders a Rust template file.
Like render_file/2, but raises on errors.
Splices fragments into a parsed template.
Returns true when source is a valid Rust template.
Returns true when a Rust fragment is valid for the given context.
Types
@type source() :: iodata()
Functions
@spec bind( RustQ.Template.t(), keyword() ) :: RustQ.Template.t()
Binds Rust placeholders in a parsed template.
RustQ placeholders use the __rq_ prefix. Use __rq_Name where Rust expects
an identifier/type/lifetime, and __rq_name!() where Rust expects an
expression or type macro.
Values may be strings, atoms, {:literal, value}, {:expr, code}, or
{:type, type} where type uses RustQ.Rust.type/1 syntax.
@spec codegen( RustQ.Template.t(), keyword() ) :: {:ok, String.t()} | {:error, [map()]}
Generates formatted Rust source from a parsed template.
@spec codegen!( RustQ.Template.t(), keyword() ) :: String.t()
Like codegen/2, but raises on errors.
@spec from_file(Path.t()) :: {:ok, RustQ.Template.t()} | {:error, [map()] | File.posix()}
Reads and parses a Rust template file.
@spec from_file!(Path.t()) :: RustQ.Template.t()
Like from_file/1, but returns the template directly or raises on errors.
@spec parse(source(), String.t()) :: {:ok, RustQ.Template.t()} | {:error, [map()]}
Parses and validates a Rust template.
filename is used only in error messages; it does not need to exist on disk.
@spec parse!(source(), String.t()) :: RustQ.Template.t()
Like parse/2, but returns the template directly or raises on errors.
@spec parse_fragment(atom(), term()) :: {:ok, RustQ.Rust.Fragment.t()} | {:error, [map()]}
Parses and validates a Rust fragment for a specific context.
Supported contexts are :item, :impl_item, :field, :stmt, :arg,
:arm, :expr, and :type.
@spec parse_fragment!(atom(), term()) :: RustQ.Rust.Fragment.t()
Like parse_fragment/2, but returns the fragment directly or raises on errors.
Convenience wrapper around parse/2, bind/2, splice/3, and codegen/2.
Options:
Like render/3, but raises on errors.
@spec render_file( Path.t(), keyword() ) :: {:ok, String.t()} | {:error, [map()] | File.posix()}
Renders a Rust template file.
Accepts the same options as render/3.
Like render_file/2, but raises on errors.
@spec splice(RustQ.Template.t(), atom(), term() | [term()]) :: RustQ.Template.t()
Splices fragments into a parsed template.
The splice name matches placeholders such as __rq_items!();,
__rq_fields: (),, or __rq_arms => unreachable!(),.
Returns true when source is a valid Rust template.
Returns true when a Rust fragment is valid for the given context.