use super::{NativeAttribute, NativeAttributeHead, NativeTemplateComponent, Origin};
use crate::embed::syntax::RetainedExpression;
use oxc_parser::AdmittedExpression;
use vize_l0::Span;
mod head;
pub use head::NativeStaticBindingHead;
pub struct NativeAttributeBindingExpression<'a> {
origin: Origin<'a>,
argument: Span,
syntax: RetainedExpression<'a>,
}
impl<'a> NativeAttributeBindingExpression<'a> {
#[must_use]
pub fn syntax(&self) -> &RetainedExpression<'a> {
&self.syntax
}
#[must_use]
pub const fn raw_value(&self) -> &'a str {
self.origin.raw_value
}
#[must_use]
pub const fn value_span(&self) -> Span {
self.origin.value_span
}
#[must_use]
pub const fn name_span(&self) -> Span {
self.origin.name_span
}
#[must_use]
pub const fn argument_span(&self) -> Span {
self.argument
}
pub fn admitted_for<'s>(
&'s self,
selected: &'s NativeTemplateComponent<'a>,
attribute: NativeAttribute<'s, 'a>,
) -> Option<NativeAttributeBindingExpressionView<'s, 'a>> {
if !self.origin.matches(selected, &attribute) {
return None;
}
self.syntax.admitted_expression()?;
Some(NativeAttributeBindingExpressionView {
owner: self,
selected,
attribute,
})
}
#[must_use]
pub fn into_syntax(self) -> RetainedExpression<'a> {
self.syntax
}
}
pub struct NativeAttributeBindingExpressionView<'s, 'a> {
owner: &'s NativeAttributeBindingExpression<'a>,
selected: &'s NativeTemplateComponent<'a>,
attribute: NativeAttribute<'s, 'a>,
}
impl<'s, 'a> NativeAttributeBindingExpressionView<'s, 'a> {
#[must_use]
pub fn selected(&self) -> &'s NativeTemplateComponent<'a> {
self.selected
}
#[must_use]
pub fn attribute(&self) -> &NativeAttribute<'s, 'a> {
&self.attribute
}
#[must_use]
pub fn operand(&self) -> &'s NativeAttributeBindingExpression<'a> {
self.owner
}
#[must_use]
pub fn expression(&self) -> Option<AdmittedExpression<'s, 'a>> {
self.owner.syntax.admitted_expression()
}
}
#[cfg(test)]
mod tests;