sonic_rs/pointer/
point.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use faststr::FastStr;

/// Represents a json pointer path. It can be created by [`pointer`] macro.
pub type JsonPointer = Vec<PointerNode>;

/// Represents a node in a json pointer path.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum PointerNode {
    Key(FastStr),
    Index(usize),
}

/// Represents a json pointer path.
///
/// Used to indexing a [`Value`][`crate::Value`], [`LazyValue`][`crate::LazyValue`],
/// [`get`][`crate::get`] or [`get_unchecked`][`crate::get_unchecked`].
///
/// The path can includes both keys or indexes.
/// - keys: string-like, used to indexing an object.
/// - indexes: usize-like, used to indexing an array.
///
/// # Examples
///
/// ```
/// # use sonic_rs::pointer;
/// use sonic_rs::JsonValueTrait;
///
/// let value: sonic_rs::Value = sonic_rs::from_str(
///     r#"{
///     "foo": [
///        0,
///        1,
///        {
///          "bar": 123
///        }
///      ]
/// }"#,
/// )
/// .unwrap();
/// let path = pointer!["foo", 2, "bar"];
///
/// let got = value.pointer(&path).unwrap();
///
/// assert_eq!(got, 123);
/// ```
#[macro_export]
macro_rules! pointer {
    () => (
        std::vec::Vec::<$crate::PointerNode>::new()
    );
    ($($x:expr),+ $(,)?) => (
        <[_]>::into_vec(
            std::boxed::Box::new([$($crate::PointerNode::from($x)),+])
        )
    );
}

#[cfg(test)]
mod test {
    #[test]
    fn test_json_pointer() {
        let pointers = pointer![];
        println!("{:?}", pointers);
        let mut pointers = pointer![1, 2, 3, "foo", "bar"];
        pointers.push(123.into());
        println!("{:?}", pointers);
    }
}