use yog_data::Value;
pub(crate) fn read_object(text: &str) -> Option<Value> {
yog_data::text::parse_value(text)
.ok()
.filter(|v| matches!(v, Value::Map(_)))
}
pub(crate) fn runtime_ids(v: &mut Value) {
match v {
Value::Str(s) if s.starts_with(yog_ids::sep::TYPED) => match yog_data::typed::classify(s) {
Ok(yog_data::typed::Spelled::Ref(r)) => match yog_data::Meaning::of(r.clone()) {
Some(yog_data::Meaning::Tag(t)) => *s = format!("{}{}", yog_ids::sep::TAG, t.id),
_ => *s = r.id.to_string(),
},
Ok(yog_data::typed::Spelled::Plain(plain)) => *s = plain,
_ => {}
},
Value::List(items) => items.iter_mut().for_each(runtime_ids),
Value::Map(m) => {
let keys: Vec<String> = m.keys().map(str::to_string).collect();
for k in keys {
if let Some(x) = m.get_mut(&k) {
runtime_ids(x);
}
}
}
_ => {}
}
}
pub(crate) fn at<'a>(v: &'a Value, keys: &[&str]) -> Option<&'a Value> {
keys.iter().try_fold(v, |v, k| v.get(k))
}
pub(crate) fn read_bytes(bytes: &[u8]) -> Option<Value> {
yog_data::text::parse_value(std::str::from_utf8(bytes).ok()?).ok()
}