# `RustQ.Rust.AST`
[🔗](https://github.com/dannote/rustq/blob/v0.11.1/lib/rustq/rust/ast.ex#L1)

Small Rust AST/IR used by macro frontends before final RustQ validation.

This is intentionally much smaller than Rust's full grammar. It captures the
Rust-shaped nodes that `RustQ.Meta.defrust/2` can produce from valid Elixir
AST, then renders them only at the final fragment-validation boundary.

# `expr`

```elixir
@type expr() ::
  RustQ.Rust.AST.Var.t()
  | RustQ.Rust.AST.Path.t()
  | RustQ.Rust.AST.Field.t()
  | RustQ.Rust.AST.Index.t()
  | RustQ.Rust.AST.Range.t()
  | RustQ.Rust.AST.Cast.t()
  | RustQ.Rust.AST.UnaryOp.t()
  | RustQ.Rust.AST.PathCall.t()
  | RustQ.Rust.AST.MethodCall.t()
  | RustQ.Rust.AST.StructLiteral.t()
  | RustQ.Rust.AST.LocalCall.t()
  | RustQ.Rust.AST.Ref.t()
  | RustQ.Rust.AST.Try.t()
  | RustQ.Rust.AST.Tuple.t()
  | RustQ.Rust.AST.VecLiteral.t()
  | RustQ.Rust.AST.ArrayLiteral.t()
  | RustQ.Rust.AST.MacroRepeatExpr.t()
  | RustQ.Rust.AST.Closure.t()
  | RustQ.Rust.AST.Literal.t()
  | RustQ.Rust.AST.ByteString.t()
  | RustQ.Rust.AST.EscapeExpr.t()
  | RustQ.Rust.AST.TokenMacro.t()
  | RustQ.Rust.AST.MacroCall.t()
  | RustQ.Rust.AST.AtomValue.t()
  | RustQ.Rust.AST.None.t()
  | RustQ.Rust.AST.Some.t()
  | RustQ.Rust.AST.Ok.t()
  | RustQ.Rust.AST.Err.t()
  | RustQ.Rust.AST.NifRaiseAtom.t()
  | RustQ.Rust.AST.BlockExpr.t()
  | RustQ.Rust.AST.UnsafeBlock.t()
  | RustQ.Rust.AST.Match.t()
  | RustQ.Rust.AST.If.t()
  | RustQ.Rust.AST.BinaryOp.t()
```

Rust expression nodes supported by RustQ's compact AST.

# `item`

```elixir
@type item() ::
  RustQ.Rust.AST.Use.t()
  | RustQ.Rust.AST.Module.t()
  | RustQ.Rust.AST.Const.t()
  | RustQ.Rust.AST.Static.t()
  | RustQ.Rust.AST.TypeAlias.t()
  | RustQ.Rust.AST.MacroItem.t()
  | RustQ.Rust.AST.MacroItemCall.t()
  | RustQ.Rust.AST.MacroRules.t()
  | RustQ.Rust.AST.Impl.t()
  | RustQ.Rust.AST.Function.t()
  | RustQ.Rust.AST.Struct.t()
  | RustQ.Rust.AST.Enum.t()
```

Rust item nodes supported by RustQ's compact AST.

# `macro_token`

```elixir
@type macro_token() ::
  String.t()
  | atom()
  | RustQ.Rust.AST.Literal.t()
  | RustQ.Rust.AST.Path.t()
  | RustQ.Rust.AST.MacroVar.t()
  | RustQ.Rust.AST.MacroCapture.t()
  | RustQ.Rust.AST.MacroRepeat.t()
```

# `pat`

```elixir
@type pat() ::
  RustQ.Rust.AST.PatVar.t()
  | RustQ.Rust.AST.PatWildcard.t()
  | RustQ.Rust.AST.PatPath.t()
  | RustQ.Rust.AST.PatLiteral.t()
  | RustQ.Rust.AST.PatNone.t()
  | RustQ.Rust.AST.PatSome.t()
  | RustQ.Rust.AST.PatAtomGuard.t()
  | RustQ.Rust.AST.PatTuple.t()
  | RustQ.Rust.AST.PatOk.t()
  | RustQ.Rust.AST.PatErr.t()
  | RustQ.Rust.AST.PatPathTuple.t()
  | RustQ.Rust.AST.PatStruct.t()
```

Rust pattern nodes supported by RustQ's compact AST.

# `stmt`

```elixir
@type stmt() ::
  RustQ.Rust.AST.Let.t()
  | RustQ.Rust.AST.LetElse.t()
  | RustQ.Rust.AST.Assign.t()
  | RustQ.Rust.AST.AssignOp.t()
  | RustQ.Rust.AST.ExprStmt.t()
  | RustQ.Rust.AST.Return.t()
  | RustQ.Rust.AST.EarlyReturn.t()
  | RustQ.Rust.AST.IfLet.t()
  | RustQ.Rust.AST.For.t()
  | RustQ.Rust.AST.Loop.t()
  | RustQ.Rust.AST.Break.t()
  | RustQ.Rust.AST.Continue.t()
```

Rust statement nodes supported by RustQ's compact AST.

# `type`

```elixir
@type type() ::
  RustQ.Rust.AST.TypePath.t()
  | RustQ.Rust.AST.TypeRef.t()
  | RustQ.Rust.AST.TypeOption.t()
  | RustQ.Rust.AST.TypeResult.t()
  | RustQ.Rust.AST.TypeNifResult.t()
  | RustQ.Rust.AST.TypeVec.t()
  | RustQ.Rust.AST.TypeSlice.t()
  | RustQ.Rust.AST.TypeArray.t()
  | RustQ.Rust.AST.TypeTuple.t()
  | RustQ.Rust.AST.TypeRaw.t()
  | RustQ.Rust.AST.TypeUnit.t()
```

Rust type nodes supported by RustQ's compact AST.

# `vis`

```elixir
@type vis() :: :pub | :crate | nil
```

# `expr_node?`

```elixir
@spec expr_node?(term()) :: boolean()
```

Returns whether a value is a structural Rust expression node.

# `pat_node?`

```elixir
@spec pat_node?(term()) :: boolean()
```

Returns whether a value is a structural Rust pattern node.

# `type_node?`

```elixir
@spec type_node?(term()) :: boolean()
```

Returns whether a value is a structural Rust type node.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
