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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use std::fmt; /// An immutable JSON source path. #[derive(Default, Clone, Debug, PartialEq)] pub struct Path(pub String); impl Path { /// Creates an empty JSON source path. /// /// # Examples /// /// Basic usage /// /// ```rust /// # use gltf_json::Path; /// let path = Path::new(); /// assert_eq!("", path.as_str()); /// ``` pub fn new() -> Self { Path(String::new()) } /// Returns a new path ending with the given field. /// /// # Examples /// /// Basic usage /// /// ```rust /// # use gltf_json::Path; /// let path = Path::new().field("foo"); /// assert_eq!("foo", path.as_str()); /// assert_eq!("foo.bar", path.field("bar").as_str()); /// ``` pub fn field(&self, name: &str) -> Self { if self.0.is_empty() { Path(name.to_string()) } else { Path(format!("{}.{}", self.0, name)) } } /// Returns a new path ending with the given array index. /// /// # Examples /// /// Basic usage /// /// ```rust /// # use gltf_json::Path; /// let path = Path::new().field("foo"); /// assert_eq!("foo[123]", path.index(123).as_str()); /// ``` pub fn index(&self, index: usize) -> Self { Path(format!("{}[{}]", self.0, index)) } /// Returns a new path ending with the given object key. /// /// # Examples /// /// Basic usage /// /// ```rust /// # use gltf_json::Path; /// let path = Path::new().field("foo"); /// assert_eq!("foo[\"bar\"]", path.key("bar").as_str()); /// ``` pub fn key(&self, key: &str) -> Self { Path(format!("{}[\"{}\"]", self.0, key)) } /// Returns a view into the internal representation. pub fn as_str(&self) -> &str { &self.0 } } impl fmt::Display for Path { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) } }