129 lines
3 KiB
Rust
129 lines
3 KiB
Rust
use ron::ser::{path_meta::Field, PrettyConfig};
|
|
|
|
#[test]
|
|
fn serialize_field() {
|
|
#[derive(serde::Serialize)]
|
|
enum PetKind {
|
|
Isopod,
|
|
}
|
|
|
|
#[derive(serde::Serialize)]
|
|
struct Pet {
|
|
name: &'static str,
|
|
age: u8,
|
|
kind: PetKind,
|
|
}
|
|
|
|
#[derive(serde::Serialize)]
|
|
struct Person {
|
|
name: &'static str,
|
|
age: u8,
|
|
knows: Vec<usize>,
|
|
pet: Option<Pet>,
|
|
}
|
|
|
|
let value = (
|
|
Person {
|
|
name: "Walter",
|
|
age: 43,
|
|
knows: vec![0, 1],
|
|
pet: None,
|
|
},
|
|
vec![
|
|
Person {
|
|
name: "Alice",
|
|
age: 29,
|
|
knows: vec![1],
|
|
pet: Some(Pet {
|
|
name: "Herbert",
|
|
age: 7,
|
|
kind: PetKind::Isopod,
|
|
}),
|
|
},
|
|
Person {
|
|
name: "Bob",
|
|
age: 29,
|
|
knows: vec![0],
|
|
pet: None,
|
|
},
|
|
],
|
|
);
|
|
|
|
let mut config = PrettyConfig::default();
|
|
|
|
config
|
|
.path_meta
|
|
.get_or_insert_with(Field::empty)
|
|
.build_fields(|fields| {
|
|
fields
|
|
.field("age")
|
|
.with_doc("0@age (person)\nmust be within range 0..256");
|
|
fields
|
|
.field("knows")
|
|
.with_doc("0@knows (person)\nmust be list of valid person indices");
|
|
fields.field("pet").build_fields(|fields| {
|
|
fields
|
|
.field("age")
|
|
.with_doc("1@age (pet)\nmust be valid range 0..256");
|
|
fields
|
|
.field("kind")
|
|
.with_doc("1@kind (pet)\nmust be `Isopod`");
|
|
});
|
|
|
|
// provide meta for a field that doesn't exist;
|
|
// this should not end up anywhere in the final string
|
|
fields.field("0").with_doc("unreachable");
|
|
});
|
|
|
|
let s = ron::ser::to_string_pretty(&value, config).unwrap();
|
|
|
|
assert_eq!(
|
|
s,
|
|
r#"((
|
|
name: "Walter",
|
|
/// 0@age (person)
|
|
/// must be within range 0..256
|
|
age: 43,
|
|
/// 0@knows (person)
|
|
/// must be list of valid person indices
|
|
knows: [
|
|
0,
|
|
1,
|
|
],
|
|
pet: None,
|
|
), [
|
|
(
|
|
name: "Alice",
|
|
/// 0@age (person)
|
|
/// must be within range 0..256
|
|
age: 29,
|
|
/// 0@knows (person)
|
|
/// must be list of valid person indices
|
|
knows: [
|
|
1,
|
|
],
|
|
pet: Some((
|
|
name: "Herbert",
|
|
/// 1@age (pet)
|
|
/// must be valid range 0..256
|
|
age: 7,
|
|
/// 1@kind (pet)
|
|
/// must be `Isopod`
|
|
kind: Isopod,
|
|
)),
|
|
),
|
|
(
|
|
name: "Bob",
|
|
/// 0@age (person)
|
|
/// must be within range 0..256
|
|
age: 29,
|
|
/// 0@knows (person)
|
|
/// must be list of valid person indices
|
|
knows: [
|
|
0,
|
|
],
|
|
pet: None,
|
|
),
|
|
])"#
|
|
);
|
|
}
|