use std::fmt;
use crate::spec::function::FunctionRegistry;
use crate::spec::query::Queryable;
use crate::ConcreteVariantObject;
use crate::LocatedNode;
use crate::NormalizedPath;
use crate::VariantValue;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Name {
name: String,
}
impl Name {
pub fn new(name: String) -> Self {
Self { name }
}
pub fn as_str(&self) -> &str {
&self.name
}
}
impl fmt::Display for Name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "'{}'", self.name)
}
}
impl Queryable for Name {
fn query<'b, T: VariantValue, Registry: FunctionRegistry<Value = T>>(
&self,
current: &'b T,
_root: &'b T,
_registry: &Registry,
) -> Vec<&'b T> {
let name = self.name.as_str();
current
.as_object()
.and_then(|o| o.get(name))
.map(|v| vec![v])
.unwrap_or_default()
}
fn query_located<'b, T: VariantValue, Registry: FunctionRegistry<Value = T>>(
&self,
current: &'b T,
_root: &'b T,
_registry: &Registry,
mut parent: NormalizedPath<'b>,
) -> Vec<LocatedNode<'b, T>> {
let name = self.name.as_str();
current
.as_object()
.and_then(|o| o.get_key_value(name))
.map(|(k, v)| {
parent.push(k);
vec![LocatedNode::new(parent, v)]
})
.unwrap_or_default()
}
}