| Crates.io | serdebug |
| lib.rs | serdebug |
| version | 1.2.0 |
| created_at | 2018-07-30 00:42:31.517514+00 |
| updated_at | 2024-09-30 21:55:08.401434+00 |
| description | serde-based replacement for #[derive(Debug)] |
| homepage | |
| repository | https://github.com/RReverser/serdebug |
| max_upload_size | |
| id | 76542 |
| size | 18,748 |
This is a drop-in replacement for #[derive(Debug)] that uses serde::Serialize under the hood to provide advanced control over output serialisation.
By default, the generated code will produce exactly same output as #[derive(Debug)] for compatibility.
However, this might be not very interesting, so let's add some serde attributes to see how we can control debug representation:
use serde::Serialize;
use serdebug::SerDebug;
pub struct CustomType(u32);
#[derive(Serialize, SerDebug)]
pub enum MyEnum {
// renaming items works as expected
#[serde(rename = "AAAAAAA!!!")]
A,
B(u32),
C { flag: bool },
}
#[derive(Serialize, SerDebug)]
// so does bulk rename on containers
#[serde(rename_all = "PascalCase")]
pub struct MyStruct {
number: u32,
my_enum: Vec<MyEnum>,
// we might want to hide some items from the output
#[serde(skip_serializing)]
hidden: bool,
// or override serialisation for otherwise verbose wrappers or
// third-party types that don't implement `Debug` and/or `Serialize`
#[serde(serialize_with = "custom_serialize")]
custom_type: CustomType,
}
fn custom_serialize<S: serde::Serializer>(value: &CustomType, ser: S) -> Result<S::Ok, S::Error> {
value.0.serialize(ser)
}
fn main() {
let s = MyStruct {
number: 42,
my_enum: vec![MyEnum::A, MyEnum::B(10), MyEnum::C { flag: true }],
hidden: true,
custom_type: CustomType(20),
};
assert_eq!(format!("{s:#?}"), "
MyStruct {
Number: 42,
MyEnum: [
AAAAAAA!!!,
B(
10,
),
C {
flag: true,
},
],
CustomType: 20,
}
".trim());
}