// Pretend that this is somebody else's crate, not a module. mod other_crate { // Neither Schemars nor the other crate provides a JsonSchema impl // for this struct. pub struct Duration { pub secs: i64, pub nanos: i32, } } //////////////////////////////////////////////////////////////////////////////// use other_crate::Duration; use schemars::{schema_for, JsonSchema}; // This is just a copy of the remote data structure that Schemars can use to // create a suitable JsonSchema impl. #[derive(JsonSchema)] #[serde(remote = "Duration")] pub struct DurationDef { pub secs: i64, pub nanos: i32, } // Now the remote type can be used almost like it had its own JsonSchema impl // all along. The `with` attribute gives the path to the definition for the // remote type. Note that the real type of the field is the remote type, not // the definition type. #[derive(JsonSchema)] pub struct Process { pub command_line: String, #[serde(with = "DurationDef")] pub wall_time: Duration, // Generic types must be explicitly specified with turbofix `::<>` syntax. #[serde(with = "Vec::")] pub durations: Vec, } fn main() { let schema = schema_for!(Process); println!("{}", serde_json::to_string_pretty(&schema).unwrap()); }