use crate::lib::{json, Value};
pub fn nth(v: Value, n: isize) -> Value {
match v {
Value::Null => json!(null),
Value::Bool(_) => json!(null),
Value::Number(_) => json!(null),
Value::String(s) => {
if s.is_empty() {
return json!(null);
}
let chars = s.chars();
let nn = {
if n < 0 {
let nn = (chars.count() as isize) + n;
if nn < 0 {
return json!(null);
}
nn
} else {
n
}
};
match s.chars().nth(nn as usize) {
Some(v) => json!(v),
None => json!(null),
}
}
Value::Array(vec) => {
if vec.is_empty() {
return json!(null);
}
let nn = {
if n < 0 {
let nn = (vec.len() as isize) + n;
if nn < 0 {
return json!(null);
}
nn
} else {
n
}
};
match vec.get(nn as usize) {
Some(v) => v.clone(),
None => json!(null),
}
}
Value::Object(_) => json!(null),
}
}
#[macro_export]
macro_rules! nth {
() => {
json!(null)
};
($a:expr $(,)*) => {
$crate::nth($a, 0)
};
($a:expr, $b:expr $(,)*) => {
$crate::nth($a, $b)
};
($a:expr, $b:expr, $($rest:tt)*) => {
$crate::nth($a, $b)
};
}