use alloc::vec::Vec;
use vize_l0::{id::NodeId, side_table::SideTable};
use vize_l2::artifact::Artifact;
use crate::placement::Placement;
mod attribute_value;
pub use attribute_value::OriginalAttributeFacts;
mod build;
pub mod dom;
pub mod native;
pub mod policy;
pub mod ssr;
pub mod vapor;
pub use build::{DecisionBuildError, build_decisions, build_dom_decisions};
pub use dom::{NativeFileAnalysis, build_dom_file_decisions};
use policy::TargetPolicy;
pub struct NativeAnalysis<'owner, 'arena> {
artifact: &'owner Artifact<'arena>,
tables: DecisionTables,
original_attributes: Option<OriginalAttributeFacts<'owner, 'arena>>,
dom: Option<dom::DomFacts<'owner, 'arena>>,
ssr: Option<ssr::SsrFacts<'owner, 'arena>>,
vapor: Option<vapor::VaporFacts<'owner, 'arena>>,
}
impl<'owner, 'arena> NativeAnalysis<'owner, 'arena> {
#[must_use]
pub fn artifact(&self) -> &'owner Artifact<'arena> {
self.artifact
}
#[must_use]
pub fn original_attributes(&self) -> Option<&OriginalAttributeFacts<'owner, 'arena>> {
self.original_attributes.as_ref()
}
#[must_use]
pub fn policy(&self) -> TargetPolicy {
self.tables.policy
}
#[must_use]
pub fn dom(&self) -> Option<&dom::DomFacts<'owner, 'arena>> {
self.dom.as_ref()
}
#[must_use]
pub fn ssr(&self) -> Option<&ssr::SsrFacts<'owner, 'arena>> {
self.ssr.as_ref()
}
#[must_use]
pub fn vapor(&self) -> Option<&vapor::VaporFacts<'owner, 'arena>> {
self.vapor.as_ref()
}
#[must_use]
pub fn tables(&self) -> &DecisionTables {
&self.tables
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StaticLevel {
Dynamic,
DynamicText,
Static,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NodeDecision {
pub static_level: StaticLevel,
pub output_level: StaticLevel,
pub dynamic_bindings: Vec<NodeId>,
pub placement: Placement,
pub control: Option<NodeId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ControlKind {
Conditional,
Loop,
Slot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ControlRegion {
pub kind: ControlKind,
pub parent: Option<NodeId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DecisionTables {
pub policy: TargetPolicy,
pub nodes: SideTable<NodeDecision>,
pub controls: SideTable<ControlRegion>,
}