atrg-codegen 0.1.1

Lexicon-driven code generation for at-rust-go
Documentation

atrg-codegen

Lexicon-driven Rust code generation for AT Protocol applications.

Part of at-rust-go (atrg) — a batteries-included AT Protocol backend framework for Rust.

What this crate provides

This crate takes AT Protocol lexicon JSON files and generates typed Rust code. It ships zero lexicon files — only the generator tooling.

  • generate(input_dir, output_dir, opts) — walks a directory of .json lexicon files and emits Rust source to the output directory
  • GenOptions — controls what gets generated (handler stubs, route wiring)
  • GenReport — summary of a generation run (files processed, types/stubs generated, output paths)

Generated output includes

  • Strongly-typed serde-derived structs for records, objects, params, and outputs
  • Axum handler stubs with correct input/output types returning Result<Json<Output>, XrpcError>
  • A xrpc_routes() function wiring all generated handlers into an Axum router
  • AT-URI helper functions for each record type

Usage

[dependencies]
atrg-codegen = "0.1"
use std::path::Path;
use atrg_codegen::{generate, GenOptions};

fn main() -> anyhow::Result<()> {
    let report = generate(
        Path::new("lexicons/"),
        Path::new("src/generated/"),
        GenOptions::default(),
    )?;

    println!(
        "Processed {} files, generated {} types and {} stubs",
        report.files_processed,
        report.types_generated,
        report.stubs_generated,
    );

    for path in &report.output_files {
        println!("  wrote {}", path);
    }

    Ok(())
}

Skipping handler stubs

If you only want type definitions without Axum route stubs:

let opts = GenOptions {
    generate_stubs: false,
    generate_routes: false,
    ..Default::default()
};

let report = generate(
    Path::new("lexicons/"),
    Path::new("src/generated/"),
    opts,
)?;

CLI usage

The atrg CLI wraps this crate:

atrg generate lexicons/

This writes generated code to src/generated/ by default.

How it works

  1. Walks input_dir for *.json files
  2. Parses each file as an AT Protocol lexicon via atproto-lexicon
  3. Generates Rust types for every record, object, query, and procedure definition
  4. Optionally generates Axum handler stubs and a route-wiring function
  5. Writes formatted Rust source files to output_dir

Generated code lives in your project — atrg's published crates never embed any specific lexicon's output.

License

LGPL-3.0-only — see LICENSE.