From 50cac7f98549b260b6ba51aaac9865d91997caa3 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Mon, 18 May 2015 22:19:30 -0700 Subject: [PATCH] Rewrite Value::lookup to not require an allocation --- src/json/value.rs | 14 ++++++++++---- tests/test_json.rs | 9 +++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/json/value.rs b/src/json/value.rs index 03e41df8..a3933608 100644 --- a/src/json/value.rs +++ b/src/json/value.rs @@ -37,8 +37,8 @@ impl Value { /// Otherwise, it will return the `Value` associated with the final key. pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Value>{ let mut target = self; - for key in keys.iter() { - match target.find(*key) { + for key in keys { + match target.find(key) { Some(t) => { target = t; }, None => return None } @@ -58,8 +58,14 @@ impl Value { /// assert!(obj.lookup("x.a").unwrap() == &Value::U64(1)); /// ``` pub fn lookup<'a>(&'a self, path: &'a str) -> Option<&'a Value> { - let paths = path.split('.').collect::>(); - self.find_path(&paths) + let mut target = self; + for key in path.split('.') { + match target.find(key) { + Some(t) => { target = t; }, + None => return None + } + } + Some(target) } /// If the `Value` is an Object, performs a depth-first search until diff --git a/tests/test_json.rs b/tests/test_json.rs index 48920a87..65c73fd1 100644 --- a/tests/test_json.rs +++ b/tests/test_json.rs @@ -1066,6 +1066,15 @@ fn test_missing_fmt_renamed_field() { assert_eq!(value, Foo { x: Some(5) }); } +#[test] +fn test_find_path() { + let obj: Value = json::from_str(r#"{"x": {"a": 1}, "y": 2}"#).unwrap(); + + assert!(obj.find_path(&["x", "a"]).unwrap() == &Value::U64(1)); + assert!(obj.find_path(&["y"]).unwrap() == &Value::U64(2)); + assert!(obj.find_path(&["z"]).is_none()); +} + #[test] fn test_lookup() { let obj: Value = json::from_str(r#"{"x": {"a": 1}, "y": 2}"#).unwrap();