use super::{NativeSsrFileAnalysis, SsrFacts};
use crate::decision::{DecisionBuildError, DecisionTables};
use vize_l0::Span;
use vize_l2::{
artifact::Artifact,
file::FileArtifact,
lang::js::{NativeTemplateFile, NativeTemplateView},
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NativeSsrBuildError {
Decision(DecisionBuildError),
StyledSource {
span: Span,
},
}
pub struct NativeTemplateSsrAnalysis<'owner, 'arena> {
view: NativeTemplateView<'owner, 'arena>,
analysis: NativeSsrFileAnalysis<'owner, 'arena>,
}
impl<'owner, 'arena> NativeTemplateSsrAnalysis<'owner, 'arena> {
#[must_use]
pub fn owner(&self) -> &'owner NativeTemplateFile<'arena> {
self.view.owner()
}
#[must_use]
pub fn file(&self) -> &'owner FileArtifact<'arena> {
self.analysis.file()
}
#[must_use]
pub fn original_attributes(
&self,
) -> Option<&crate::decision::OriginalAttributeFacts<'owner, 'arena>> {
self.analysis.original_attributes()
}
#[must_use]
pub fn artifact(&self) -> &'owner Artifact<'arena> {
self.analysis.artifact()
}
#[must_use]
pub fn tables(&self) -> &DecisionTables {
self.analysis.tables()
}
#[must_use]
pub fn ssr(&self) -> Option<&SsrFacts<'owner, 'arena>> {
self.analysis.ssr()
}
}
pub fn build_native_ssr_file_decisions<'owner, 'arena>(
view: NativeTemplateView<'owner, 'arena>,
) -> Result<NativeTemplateSsrAnalysis<'owner, 'arena>, NativeSsrBuildError> {
let selected = view.owner().selected();
if selected.has_styles() {
return Err(NativeSsrBuildError::StyledSource {
span: Span::new(0, selected.component().block().root_source().len() as u32),
});
}
let file = view.file().ok_or(NativeSsrBuildError::Decision(
DecisionBuildError::IncompleteFile,
))?;
let analysis =
super::file::build_original_file_decisions(file).map_err(NativeSsrBuildError::Decision)?;
Ok(NativeTemplateSsrAnalysis { view, analysis })
}