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
use indexmap::IndexSet; use value::Value; pub trait ValueExt { fn referenced_variables(&self) -> IndexSet<&str>; } impl ValueExt for Value { fn referenced_variables(&self) -> IndexSet<&str> { pub fn referenced_variables_to_set<'a>(value: &'a Value, vars: &mut IndexSet<&'a str>) { match value { Value::Variable(name) => { vars.insert(name); } Value::List(values) => values .iter() .for_each(|value| referenced_variables_to_set(value, vars)), Value::Object(obj) => obj .values() .for_each(|value| referenced_variables_to_set(value, vars)), _ => {} } } let mut vars = IndexSet::new(); referenced_variables_to_set(self, &mut vars); vars } }