94 lines
2.1 KiB
Rust
94 lines
2.1 KiB
Rust
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<i32>,
|
|
}
|
|
|
|
#[derive(JsonSchema, Deserialize, Serialize, Default)]
|
|
#[schemars(rename = "Flat")]
|
|
struct Deep1 {
|
|
f: f32,
|
|
#[serde(flatten)]
|
|
deep2: Deep2,
|
|
v: Vec<i32>,
|
|
}
|
|
|
|
#[derive(JsonSchema, Deserialize, Serialize, Default)]
|
|
struct Deep2 {
|
|
b: bool,
|
|
#[serde(flatten, skip_serializing_if = "Option::is_none")]
|
|
deep3: Option<Deep3>,
|
|
}
|
|
|
|
#[derive(JsonSchema, Deserialize, Serialize)]
|
|
struct Deep3 {
|
|
s: String,
|
|
}
|
|
|
|
#[test]
|
|
fn flattened_struct() {
|
|
test!(Deep1)
|
|
.assert_snapshot()
|
|
.assert_identical::<Flat>()
|
|
.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<String, Value>,
|
|
}
|
|
|
|
#[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::<FlattenValue>()
|
|
.assert_allows_ser_roundtrip_default()
|
|
.assert_matches_de_roundtrip(arbitrary_values());
|
|
}
|