use crate::lib::{json, Value};
use crate::to_path_x;
pub fn get(object: Value, path: Value, default: Value) -> Value {
let p_vec = to_path_x(path);
if p_vec.is_empty() {
return default;
}
let mut cur: Value = object;
for k in p_vec.iter() {
cur = match cur {
Value::String(s) => match k.parse::<usize>() {
Ok(n) => match s.chars().nth(n) {
Some(s) => json!(s),
None => return default,
},
Err(_) => return default,
},
Value::Array(_) => match k.parse::<usize>() {
Ok(n) => match cur.get(n) {
Some(v) => v.clone(),
None => return default,
},
Err(_) => return default,
},
Value::Object(_) => match cur.get(k) {
Some(v) => v.clone(),
None => return default,
},
_ => return default,
}
}
cur
}
#[macro_export]
macro_rules! get {
() => {
$crate::internal::value_undefined()
};
($a:expr $(,)*) => {
$crate::internal::value_undefined()
};
($a:expr, $b:expr $(,)*) => {
$crate::get($a, $b, $crate::internal::value_undefined())
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::get($a, $b, $c)
};
}