Skip to main content

blazingly_json/
lib.rs

1//! Focused JSON parsing and encoding for Blazingly protocol workloads.
2
3mod canonical;
4mod de;
5mod error;
6mod map;
7mod number;
8mod raw;
9mod raw_value;
10mod ser;
11pub mod value;
12mod value_de;
13
14pub use canonical::{CanonicalBytesScanner, CanonicalScanner};
15pub use de::{from_slice, from_str, Deserializer, Field, JsonCursor, Object};
16pub use error::{Error, Result};
17pub use map::Map;
18pub use number::Number;
19pub use raw::RawJson;
20pub use raw_value::{to_raw_value, RawValue};
21pub use ser::{
22    to_string, to_string_pretty, to_value, to_vec, to_vec_pretty, to_writer, Serializer,
23};
24pub use value::{from_value, Value, ValueIndex};
25
26#[doc(hidden)]
27#[macro_export]
28macro_rules! __json_array {
29    ($values:ident;) => {};
30    ($values:ident; null $(, $($rest:tt)*)?) => {
31        $values.push($crate::Value::Null);
32        $crate::__json_array!($values; $($($rest)*)?);
33    };
34    ($values:ident; [$($array:tt)*] $(, $($rest:tt)*)?) => {
35        $values.push($crate::json!([$($array)*]));
36        $crate::__json_array!($values; $($($rest)*)?);
37    };
38    ($values:ident; {$($object:tt)*} $(, $($rest:tt)*)?) => {
39        $values.push($crate::json!({$($object)*}));
40        $crate::__json_array!($values; $($($rest)*)?);
41    };
42    ($values:ident; $value:expr $(, $($rest:tt)*)?) => {
43        $values.push($crate::to_value(&$value).expect("JSON value serialization failed"));
44        $crate::__json_array!($values; $($($rest)*)?);
45    };
46}
47
48#[doc(hidden)]
49#[macro_export]
50macro_rules! __json_object {
51    ($object:ident;) => {};
52    ($object:ident; ($key:expr) : null $(, $($rest:tt)*)?) => {
53        $object.insert(($key).into(), $crate::Value::Null);
54        $crate::__json_object!($object; $($($rest)*)?);
55    };
56    ($object:ident; ($key:expr) : [$($array:tt)*] $(, $($rest:tt)*)?) => {
57        $object.insert(($key).into(), $crate::json!([$($array)*]));
58        $crate::__json_object!($object; $($($rest)*)?);
59    };
60    ($object:ident; ($key:expr) : {$($nested:tt)*} $(, $($rest:tt)*)?) => {
61        $object.insert(($key).into(), $crate::json!({$($nested)*}));
62        $crate::__json_object!($object; $($($rest)*)?);
63    };
64    ($object:ident; ($key:expr) : $value:expr $(, $($rest:tt)*)?) => {
65        $object.insert(
66            ($key).into(),
67            $crate::to_value(&$value).expect("JSON value serialization failed"),
68        );
69        $crate::__json_object!($object; $($($rest)*)?);
70    };
71    ($object:ident; $key:literal : null $(, $($rest:tt)*)?) => {
72        $object.insert(($key).into(), $crate::Value::Null);
73        $crate::__json_object!($object; $($($rest)*)?);
74    };
75    ($object:ident; $key:literal : [$($array:tt)*] $(, $($rest:tt)*)?) => {
76        $object.insert(($key).into(), $crate::json!([$($array)*]));
77        $crate::__json_object!($object; $($($rest)*)?);
78    };
79    ($object:ident; $key:literal : {$($nested:tt)*} $(, $($rest:tt)*)?) => {
80        $object.insert(($key).into(), $crate::json!({$($nested)*}));
81        $crate::__json_object!($object; $($($rest)*)?);
82    };
83    ($object:ident; $key:literal : $value:expr $(, $($rest:tt)*)?) => {
84        $object.insert(
85            ($key).into(),
86            $crate::to_value(&$value).expect("JSON value serialization failed"),
87        );
88        $crate::__json_object!($object; $($($rest)*)?);
89    };
90}
91
92/// Constructs a [`Value`] with JSON-like syntax.
93#[macro_export]
94macro_rules! json {
95    (null) => {
96        $crate::Value::Null
97    };
98    ([$($tokens:tt)*]) => {{
99        let mut values = ::std::vec::Vec::new();
100        $crate::__json_array!(values; $($tokens)*);
101        $crate::Value::Array(values)
102    }};
103    ({$($tokens:tt)*}) => {{
104        let mut object = $crate::Map::new();
105        $crate::__json_object!(object; $($tokens)*);
106        $crate::Value::Object(object)
107    }};
108    ($value:expr) => {
109        $crate::to_value(&$value).expect("JSON value serialization failed")
110    };
111}