RustQ.Rustler.Schema (rustq v0.2.0)

Copy Markdown View Source

Schema DSL for generating Rustler structs and tagged enums.

Use this when a group of Elixir structs should be mirrored in Rust. A schema module defines nodes, fields, type aliases, and tagged enums; rust_items/1 returns Rust fragments ready for rustq.exs.

defmodule MyApp.Codegen.ContentSchema do
  use RustQ.Rustler.Schema

  schema MyApp.Content do
    node Text do
      field :text, :String
      field :size, {:option, :String}
    end

    node Paragraph do
      field :body, {:vec, Content}
    end

    tagged_enum Content do
      variants :all
    end
  end
end

Field optionality is encoded in the Rust type ({:option, :String}), keeping the schema close to the generated Rust.

Summary

Types

enum_decl()

@type enum_decl() :: {atom(), keyword()}

field()

@type field() :: {atom(), RustQ.Rust.rust_type(), keyword()}

schema_node()

@type schema_node() :: {atom(), [field()], keyword()}

t()

@type t() :: %RustQ.Rustler.Schema{
  default_attrs: [term()],
  enums: [enum_decl()],
  module_prefix: module(),
  nodes: [schema_node()],
  rust_prefix: String.t(),
  tag_field: atom(),
  type_aliases: [type_alias()]
}

type_alias()

@type type_alias() :: {atom(), RustQ.Rust.rust_type()}

Functions

default_attrs(attrs)

(macro)

node(name, opts \\ [], list)

(macro)

rust_items(schema)

@spec rust_items(%RustQ.Rustler.Schema{
  default_attrs: term(),
  enums: term(),
  module_prefix: term(),
  nodes: term(),
  rust_prefix: term(),
  tag_field: term(),
  type_aliases: term()
}) :: [RustQ.Rust.Fragment.t()]

rust_prefix(prefix)

(macro)

schema(module_prefix, opts \\ [], list)

(macro)

tag_field(field)

(macro)

tagged_enum(name, opts \\ [], list)

(macro)

type(name, rust_type)

(macro)