macro_rules! json {
(
$(#[$attr:meta])*
$vis:vis struct $name:ident { $($body:tt)* }
) => { ... };
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > { $($body:tt)* }
) => { ... };
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty:ty $(,)? ) ;
) => { ... };
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty:ty $(,)? ) ;
) => { ... };
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => { ... };
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => { ... };
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => { ... };
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => { ... };
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => { ... };
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => { ... };
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => { ... };
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => { ... };
(
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => { ... };
(
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => { ... };
}Expand description
Emit a struct or enum together with both its FromJson
and ToJson impls.
This is the combined form of from_json! and to_json!. Use it
when a type needs to both parse and serialize — it emits the type
definition once, avoiding the duplicate-definition error you’d get
from invoking both single-trait macros on the same type.
use json_bourne::{json, parse_str, to_string};
json! {
#[derive(Debug, PartialEq)]
struct Point { x: i32, y: i32 }
}
let p: Point = parse_str(r#"{"x":1,"y":2}"#).unwrap();
assert_eq!(to_string(&p).unwrap(), r#"{"x":1,"y":2}"#);