use serde_json::value::Value;
use crate::error::ClickError;
use std::borrow::Cow;
pub fn val_str<'a>(pointer: &str, value: &'a Value, default: &'a str) -> Cow<'a, str> {
match value.pointer(pointer) {
Some(p) => match p.as_str() {
Some(s) => s.into(),
None => default.into(),
},
None => default.into(),
}
}
#[allow(dead_code)] pub fn val_num(pointer: &str, value: &Value, default: &str) -> String {
match value.pointer(pointer) {
Some(p) => match p.as_i64() {
Some(i) => format!("{i}"),
None => default.into(),
},
None => default.into(),
}
}
pub fn val_str_opt(pointer: &str, value: &Value) -> Option<String> {
value
.pointer(pointer)
.map(|p| p.as_str().map(|s| s.to_owned()))
.and_then(|s| s)
}
pub fn val_u64(pointer: &str, value: &Value, default: u64) -> u64 {
match value.pointer(pointer) {
Some(p) => match p.as_u64() {
Some(i) => i,
None => default,
},
None => default,
}
}
pub fn _val_item_count(pointer: &str, value: &Value) -> usize {
match value.pointer(pointer) {
Some(p) => {
if p.is_array() {
p.as_array().unwrap().len() } else if p.is_object() {
p.as_object().unwrap().len() } else {
0
}
}
None => 0,
}
}
pub fn _get_val_as<T>(pointer: &str, value: &Value) -> Result<T, ClickError>
where
for<'de> T: serde::Deserialize<'de>,
{
match value.pointer(pointer) {
Some(p) => serde::Deserialize::deserialize(p).map_err(ClickError::from),
None => Err(ClickError::ParseErr("Can't deserialize".to_owned())),
}
}