use super::super::{DescriptorIssue, DescriptorOptions, TemplateNamePair, TemplateSelection};
use super::{Vue2DescriptorObservation, Vue2DescriptorRefusal};
use crate::container::Container;
use crate::dialect::vue2::surface::ComponentExpressionPool;
use vize_l0::{SourceBlock, SourceRoot, Span, Vec};
#[derive(Debug)]
pub struct Vue2DescriptorExpressionPool<'a> {
#[cfg(test)]
_drop_probe: super::hooks::OwnerDrop,
container: Container<'a>,
root: Option<SourceRoot<'a>>,
options: DescriptorOptions,
issues: Vec<'a, DescriptorIssue>,
selection: Option<TemplateSelection<'a>>,
component: Option<ComponentExpressionPool<'a>>,
selected: bool,
}
impl<'a> Vue2DescriptorExpressionPool<'a> {
pub fn source(&self) -> &'a str {
self.container.source
}
pub fn root(&self) -> Option<SourceRoot<'a>> {
self.root
}
pub fn options(&self) -> DescriptorOptions {
self.options
}
pub fn container(&self) -> &Container<'a> {
&self.container
}
pub fn issues(&self) -> &[DescriptorIssue] {
&self.issues
}
pub fn component(&self) -> Option<&ComponentExpressionPool<'a>> {
self.component.as_ref()
}
pub fn selected(&self) -> Result<Vue2RetainedTemplateView<'_, 'a>, Vue2DescriptorRefusal<'_>> {
let view = self
.selected
.then(|| {
let selection = self.selection.as_ref()?;
Some(Vue2RetainedTemplateView {
owner: self,
component: self.component.as_ref()?,
selection,
names: selection.names.as_ref()?,
})
})
.flatten();
view.ok_or(Vue2DescriptorRefusal {
issues: &self.issues,
errors: &self.container.errors,
})
}
}
impl<'a> Vue2DescriptorObservation<'a> {
pub fn into_expression_pool(self) -> Vue2DescriptorExpressionPool<'a> {
let selected = self.selected().is_ok();
let Self {
container,
root,
options,
issues,
selection,
component,
#[cfg(test)]
_drop_probe: drop_probe,
} = self;
Vue2DescriptorExpressionPool {
container,
root,
options,
issues,
selection,
component: component.map(|component| component.into_expression_pool()),
selected,
#[cfg(test)]
_drop_probe: drop_probe,
}
}
}
#[derive(Debug)]
pub struct Vue2RetainedTemplateView<'o, 'a> {
owner: &'o Vue2DescriptorExpressionPool<'a>,
component: &'o ComponentExpressionPool<'a>,
selection: &'o TemplateSelection<'a>,
names: &'o TemplateNamePair,
}
impl<'o, 'a> Vue2RetainedTemplateView<'o, 'a> {
pub fn observation(&self) -> &'o Vue2DescriptorExpressionPool<'a> {
self.owner
}
pub fn component(&self) -> &'o ComponentExpressionPool<'a> {
self.component
}
pub fn block(&self) -> SourceBlock<'a> {
self.component.block()
}
pub fn container_index(&self) -> usize {
self.selection.selection.index
}
pub fn opening_name(&self) -> Span {
self.names.opening
}
pub fn closing_name(&self) -> Span {
self.names.closing
}
}
#[cfg(test)]
mod tests;