preserves-schema-rs

The preserves-schema-rs program reads Preserves Schema AST input files (such as are produced by preserves-schemac). It produces a collection of Rust source files providing parsers, unparsers, and Rust data structures reflecting the definitions in the inputs.

Using the compiler from build.rs instead

You will usually not need to use the preserves-schema-rs command-line program. Instead, access the preserves-schema compiler API from your build.rs. The following example is taken from build.rs for the preserves-path crate:

use preserves_schema::compiler::*;

use std::io::Error;
use std::path::PathBuf;

fn main() -> Result<(), Error> {
    let buildroot = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());

    let mut gen_dir = buildroot.clone();
    gen_dir.push("src/schemas");

    let mut c = CompilerConfig::new(gen_dir, "crate::schemas".to_owned());

    let inputs = expand_inputs(&vec!["path.bin".to_owned()])?;
    c.load_schemas_and_bundles(&inputs)?;

    compile(&c)
}

This approach also requires an include! from your main, hand-written source tree. The following is a snippet from preserves-path/src/lib.rs:

pub mod schemas {
    include!(concat!(env!("OUT_DIR"), "/src/schemas/mod.rs"));
}

Installation

The tool is written in Rust. Install cargo. Then, cargo install preserves-schema.

Usage

preserves-schema 1.0.0

USAGE:
    preserves-schema-rs [OPTIONS] --output-dir <output-dir> --prefix <prefix> [--] [input-glob]...

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --module <module>...
    -o, --output-dir <output-dir>
    -p, --prefix <prefix>
        --support-crate <support-crate>

ARGS:
    <input-glob>...