RustQ (rustq v0.2.0)

Copy Markdown View Source

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:

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

source()

@type source() :: iodata()

Functions

bind(template, bindings)

@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.

codegen(template, opts \\ [])

@spec codegen(
  RustQ.Template.t(),
  keyword()
) :: {:ok, String.t()} | {:error, [map()]}

Generates formatted Rust source from a parsed template.

codegen!(template, opts \\ [])

@spec codegen!(
  RustQ.Template.t(),
  keyword()
) :: String.t()

Like codegen/2, but raises on errors.

from_file(path)

@spec from_file(Path.t()) ::
  {:ok, RustQ.Template.t()} | {:error, [map()] | File.posix()}

Reads and parses a Rust template file.

from_file!(path)

@spec from_file!(Path.t()) :: RustQ.Template.t()

Like from_file/1, but returns the template directly or raises on errors.

parse(source, filename)

@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.

parse!(source, filename)

@spec parse!(source(), String.t()) :: RustQ.Template.t()

Like parse/2, but returns the template directly or raises on errors.

parse_fragment(kind, fragment)

@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.

parse_fragment!(kind, fragment)

@spec parse_fragment!(atom(), term()) :: RustQ.Rust.Fragment.t()

Like parse_fragment/2, but returns the fragment directly or raises on errors.

render(source, filename, opts \\ [])

@spec render(source(), String.t(), keyword()) :: {:ok, String.t()} | {:error, [map()]}

Convenience wrapper around parse/2, bind/2, splice/3, and codegen/2.

Options:

  • :bind - bindings passed to bind/2.
  • :splice - splice replacements passed to splice/3.
  • :preamble - optional text prepended after formatting.

render!(source, filename, opts \\ [])

@spec render!(source(), String.t(), keyword()) :: String.t()

Like render/3, but raises on errors.

render_file(path, opts \\ [])

@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.

render_file!(path, opts \\ [])

@spec render_file!(
  Path.t(),
  keyword()
) :: String.t()

Like render_file/2, but raises on errors.

splice(template, name, replacement)

@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!(),.

valid?(source, filename)

@spec valid?(source(), String.t()) :: boolean()

Returns true when source is a valid Rust template.

valid_fragment?(kind, fragment)

@spec valid_fragment?(atom(), term()) :: boolean()

Returns true when a Rust fragment is valid for the given context.