use super::{NativeAttribute, NativeAttributeHead, NativeTemplateComponent, Origin};
use crate::dialect::vue3::operand::ModelModifier;
use crate::embed::syntax::RetainedExpression;
use oxc_parser::AdmittedExpression;
use vize_l0::Span;
mod head;
pub use head::NativeModelHead;
pub struct NativeAttributeModelExpression<'a> {
origin: Origin<'a>,
syntax: RetainedExpression<'a>,
modifier: Option<ModelModifier>,
}
impl<'a> NativeAttributeModelExpression<'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 trim_span(&self) -> Option<Span> {
match self.modifier {
Some(ModelModifier::Trim(span)) => Some(span),
_ => None,
}
}
#[must_use]
pub const fn lazy_span(&self) -> Option<Span> {
match self.modifier {
Some(ModelModifier::Lazy(span)) => Some(span),
_ => None,
}
}
#[must_use]
pub const fn number_span(&self) -> Option<Span> {
match self.modifier {
Some(ModelModifier::Number(span)) => Some(span),
_ => None,
}
}
pub fn admitted_for<'s>(
&'s self,
selected: &'s NativeTemplateComponent<'a>,
attribute: NativeAttribute<'s, 'a>,
) -> Option<NativeAttributeModelExpressionView<'s, 'a>> {
if !self.origin.matches(selected, &attribute) {
return None;
}
self.syntax.admitted_expression()?;
Some(NativeAttributeModelExpressionView {
owner: self,
selected,
attribute,
})
}
#[must_use]
pub fn into_syntax(self) -> RetainedExpression<'a> {
self.syntax
}
}
pub struct NativeAttributeModelExpressionView<'s, 'a> {
owner: &'s NativeAttributeModelExpression<'a>,
selected: &'s NativeTemplateComponent<'a>,
attribute: NativeAttribute<'s, 'a>,
}
impl<'s, 'a> NativeAttributeModelExpressionView<'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 NativeAttributeModelExpression<'a> {
self.owner
}
#[must_use]
pub fn expression(&self) -> Option<AdmittedExpression<'s, 'a>> {
self.owner.syntax.admitted_expression()
}
}
#[cfg(test)]
mod tests;