use crate::prelude::*; use std::collections::BTreeMap; #[derive(JsonSchema, Deserialize, Serialize, Default)] struct Flat { f: f32, b: bool, #[serde(default, skip_serializing_if = "str::is_empty")] s: String, v: Vec, } #[derive(JsonSchema, Deserialize, Serialize, Default)] #[schemars(rename = "Flat")] struct Deep1 { f: f32, #[serde(flatten)] deep2: Deep2, v: Vec, } #[derive(JsonSchema, Deserialize, Serialize, Default)] struct Deep2 { b: bool, #[serde(flatten, skip_serializing_if = "Option::is_none")] deep3: Option, } #[derive(JsonSchema, Deserialize, Serialize)] struct Deep3 { s: String, } #[test] fn flattened_struct() { test!(Deep1) .assert_snapshot() .assert_identical::() .assert_allows_ser_roundtrip([ Deep1::default(), Deep1 { f: 1.0, deep2: Deep2 { b: true, deep3: Some(Deep3 { s: "test".to_owned(), }), }, v: vec![123], }, ]) .assert_matches_de_roundtrip(arbitrary_values()); } #[derive(JsonSchema, Deserialize, Serialize, Default)] struct FlattenValue { flag: bool, #[serde(flatten)] value: Value, } #[derive(JsonSchema, Deserialize, Serialize, Default)] #[schemars(rename = "FlattenValue")] struct FlattenMap { flag: bool, #[serde(flatten)] value: BTreeMap, } #[test] fn flattened_value() { test!(FlattenValue) .assert_snapshot() .assert_allows_ser_roundtrip([ FlattenValue { flag: false, value: Value::Null, }, FlattenValue { flag: true, value: Value::Object(Default::default()), }, ]) .assert_matches_de_roundtrip(arbitrary_values()); } #[test] fn flattened_map() { test!(FlattenMap) .assert_identical::() .assert_allows_ser_roundtrip_default() .assert_matches_de_roundtrip(arbitrary_values()); }