Generate in build.rs
Two APIs — pick whichever fits your project:
generate_to_dir
writes generated codecs to a directory you control (prefer src/generated/ for
IDE go-to-definition). The feature-tour sample uses this pattern:
#![allow(unused)] fn main() { let generated_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src/generated"); let config = ergo_sbe::GenerationConfig::new("feature_tour") .with_domain_objects(ergo_sbe::DomainVarData::Strings) .with_domain_type( ergo_sbe::ConversionSelector::named_type("BooleanType"), "bool") .with_domain_type( ergo_sbe::ConversionSelector::semantic_type("UTCTimestamp"), "chrono::DateTime<chrono::Utc>") .with_conversion(ergo_sbe::ConversionSelector::named_type("Decimal")) // Same shape as Decimal, but the app supplies the impl itself — see // demo_domain_type_manual_impl in src/lib.rs. .with_manual_domain_type( ergo_sbe::ConversionSelector::named_type("ManualDecimal"), "rust_decimal::Decimal"); ergo_sbe::generate_to_dir("schemas/feature-tour.xml", config, &generated_dir)?; }
generate_to_out_dir
writes to Cargo's $OUT_DIR and emits cargo::rerun-if-changed automatically.
Use with include!(concat!(env!("OUT_DIR"), …)) — simpler, but
rust-analyzer usually cannot jump into generated code.
Schema from a string / include_str!:
generate_str_to_out_dir.
Need multi-schema or custom output paths? Use the lower-level
parse_file +
Generator
API (same steps the helper runs). For shared types across schemas, see
Multi-Schema Patterns below.