Display / Debug
Diagnostic only — not a stable wire or log schema. Do not treat either format as a protocol or long-term log contract.
Display currently equals Debug for generated decoders ({car} and
{car:?} print the same text). Prefer Debug in logs if you want that intent
to stay obvious when/if the two diverge later.
#![allow(unused)] fn main() { pub fn demo_display_debug(valid_car: &[u8]) -> Result<(), Box<dyn std::error::Error>> { let car = CarDecoder::try_from(valid_car)?; let display = format!("{car}"); let debug = format!("{car:#?}"); // Display is a compact one-liner; field names use the schema's camelCase. assert!(display.contains("serialNumber: 1234")); assert!(display.contains("modelYear: 2013")); assert!(display.contains("available: true")); assert!(display.contains(r#"code: A"#)); assert!(display.contains("manufacturer: \"Honda\"")); assert!(display.contains("model: \"Civic VTi\"")); assert!(display.contains("fuelFigures: [")); assert!(display.contains("performanceFigures: [")); assert!(display.contains(r#"activationCode: "abcdef""#)); // Pretty Debug ({:#?}) shows each field on its own line with indentation. for expected in &[ "serialNumber: 1234", "modelYear: 2013", "available: true", r#"manufacturer: "Honda""#, r#"model: "Civic VTi""#, r#"activationCode: "abcdef""#, r#"usageDescription: Urban"#, "speed: 30", "mpg: 35.9", "octaneRating: 95", ] { assert!( debug.contains(expected), "Debug missing: {expected}\n--- full debug ---\n{debug}" ); } // ── CarDomain DTO ─────────────────────────────────────────────────── // Owned, heap-allocated, serialisable snapshot of the full message tree. // Generated by `with_domain_objects(DomainVarData::Strings)`. let dto = CarDomain::try_from_decoder(car)?; let dto_dbg = format!("{dto:#?}"); // DTO field names use Rust snake_case (different from wire decoder camelCase). assert!(dto_dbg.contains("serial_number: 1234")); assert!(dto_dbg.contains("model_year: 2013")); assert!(dto_dbg.contains("available: true")); assert!(dto_dbg.contains("fuel_figures: [")); assert!(dto_dbg.contains(r#"usage_description: "Urban""#)); assert!(dto_dbg.contains(r#"manufacturer: "Honda""#)); assert!(dto_dbg.contains(r#"activation_code: "abcdef""#)); Ok(()) } }
(This code comes from the sbe-feature-tour sample crate.)
Real output from the feature-tour Car (demo_car_size_and_encode →
CarDecoder):
CarDecoder { serialNumber: 1234, modelYear: 2013, available: true, code: A, fuelFigures: ["{ speed: 30, mpg: 35.9, usageDescription: Urban }", "{ speed: 60, mpg: 25.0, usageDescription: Highway }"], performanceFigures: ["{ octaneRating: 95, acceleration: [{ mph: 30, seconds: 4.0 }, { mph: 60, seconds: 7.5 }] }"], manufacturer: "Honda", model: "Civic VTi", activationCode: "abcdef" }
Truncated / incomplete buffers omit missing tails rather than panicking.