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);
}
}