use super::super::{
NativeAttributeExpressionFailure, NativeAttributeOperandError, observe_expression_value,
};
use super::{NativeAttributeBindingExpression, NativeAttributeHead};
use crate::dialect::vue3::operand::static_binding_parts;
use vize_l0::Span;
pub struct NativeStaticBindingHead<'h, 'o, 'a> {
head: &'h NativeAttributeHead<'o, 'a>,
argument: Span,
}
impl<'o, 'a> NativeAttributeHead<'o, 'a> {
pub fn static_binding(
&self,
) -> Result<Option<NativeStaticBindingHead<'_, 'o, 'a>>, NativeAttributeOperandError> {
let argument = static_binding_parts(self.directive(), self.name_block())?;
Ok(argument.map(|argument| NativeStaticBindingHead {
head: self,
argument,
}))
}
}
impl<'h, 'o, 'a> NativeStaticBindingHead<'h, 'o, 'a> {
#[must_use]
pub fn head(&self) -> &'h NativeAttributeHead<'o, 'a> {
self.head
}
#[must_use]
pub const fn argument_span(&self) -> Span {
self.argument
}
pub fn observe_expression(
self,
) -> Result<NativeAttributeBindingExpression<'a>, NativeAttributeExpressionFailure<'a>> {
let (origin, syntax) =
observe_expression_value(self.head.selected(), self.head.attribute().reborrow())?;
Ok(NativeAttributeBindingExpression {
origin,
argument: self.argument,
syntax,
})
}
}