mirror of
https://github.com/bytedream/serde-inline-default.git
synced 2025-05-09 04:05:12 +02:00
40 lines
1.1 KiB
Rust
40 lines
1.1 KiB
Rust
use serde_json::json;
|
|
macro_rules! simple_macro {
|
|
(struct $name:ident { $($field:ident: $type:ty $(= $default:expr)?),*$(,)? }) => {
|
|
#[serde_inline_default::serde_inline_default]
|
|
#[derive(serde::Deserialize)]
|
|
struct $name {
|
|
$(
|
|
$(
|
|
#[serde_inline_default($default)]
|
|
)?
|
|
$field: $type
|
|
),*
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() -> Result<(), serde_json::Error> {
|
|
// `username` and `password` must be set when deserializing as no default value is defined for
|
|
// them. `secret` not as we're defining a default value for it
|
|
simple_macro! {
|
|
struct Example {
|
|
username: String,
|
|
password: String,
|
|
secret: String = "verysecretsecret".to_string()
|
|
}
|
|
}
|
|
|
|
let json_object = json!({
|
|
"username": "testuser",
|
|
"password": "testpassword"
|
|
});
|
|
|
|
let example: Example = serde_json::from_value(json_object)?;
|
|
assert_eq!(example.username, "testuser");
|
|
assert_eq!(example.password, "testpassword");
|
|
assert_eq!(example.secret, "verysecretsecret");
|
|
|
|
Ok(())
|
|
}
|