Skip to main content

json

Macro json 

Source
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}"#);