use substrate_data::{Kind, Ref};
use crate::found::TagRef;
const DATA_OPEN: &str = "{";
use crate::{Res, kinds};
#[derive(Debug, Clone, PartialEq)]
pub enum Meaning {
Content(Ref),
Tag(TagRef),
Res(Res),
Image(String),
Lang(String),
}
impl Meaning {
pub fn of(r: Ref) -> Option<Meaning> {
let (kind, id) = (r.kind.as_str(), r.id.as_str());
Some(if kind == kinds::Tag::NAME {
let (kind, id) = id.split_once(yog_ids::sep::NAMESPACE)?;
Meaning::Tag(TagRef {
kind: kind.to_owned(),
id: id.to_owned(),
})
} else if kind == kinds::Res::NAME {
Meaning::Res(Res::parse(id)?)
} else if kind == kinds::Image::NAME {
Meaning::Image(id.to_owned())
} else if kind == kinds::Lang::NAME {
Meaning::Lang(id.to_owned())
} else {
let base = id.split(yog_ids::sep::STATE_OPEN).next().unwrap_or(id);
let base = base.split(DATA_OPEN).next().unwrap_or(base);
if !yog_ids::valid_id(base) {
return None;
}
Meaning::Content(Ref::parse(kind, &yog_ids::qualify(id)).ok()?)
})
}
}