use crate::parser::Script;
#[cfg(feature = "plugins")]
use crate::plugin::ExtensionRegistry;
use alloc::vec::Vec;
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScriptAnalysisOptions: u8 {
const UNICODE_LINEBREAKS = 1 << 0;
const PERFORMANCE_HINTS = 1 << 1;
const STRICT_COMPLIANCE = 1 << 2;
const BIDI_ANALYSIS = 1 << 3;
}
}
mod construction;
pub mod events;
pub mod linting;
mod queries;
pub mod styles;
#[cfg(test)]
mod analysis_tests;
pub use events::{
count_overlapping_dialogue_events, count_overlapping_events, find_overlapping_dialogue_events,
find_overlapping_events, DialogueInfo,
};
pub use linting::{lint_script, LintConfig, LintIssue, LintRule};
pub use styles::{ResolvedStyle, StyleAnalyzer};
#[derive(Debug, Clone)]
pub struct ScriptAnalysis<'a> {
pub script: &'a Script<'a>,
lint_issues: Vec<LintIssue>,
resolved_styles: Vec<ResolvedStyle<'a>>,
dialogue_info: Vec<DialogueInfo<'a>>,
config: AnalysisConfig,
#[cfg(feature = "plugins")]
registry: Option<&'a ExtensionRegistry>,
}
#[derive(Debug, Clone)]
pub struct AnalysisConfig {
pub options: ScriptAnalysisOptions,
pub max_events_threshold: usize,
}
impl Default for AnalysisConfig {
fn default() -> Self {
Self {
options: ScriptAnalysisOptions::UNICODE_LINEBREAKS
| ScriptAnalysisOptions::PERFORMANCE_HINTS
| ScriptAnalysisOptions::BIDI_ANALYSIS,
max_events_threshold: 1000,
}
}
}
#[derive(Debug, Clone)]
pub struct PerformanceSummary {
pub total_events: usize,
pub overlapping_events: usize,
pub complex_animations: usize,
pub large_fonts: usize,
pub performance_score: u8,
}
impl PerformanceSummary {
#[must_use]
pub const fn has_performance_issues(&self) -> bool {
self.performance_score < 80
}
#[must_use]
pub const fn recommendation(&self) -> Option<&'static str> {
if self.overlapping_events > 10 {
Some("Consider reducing overlapping events for better performance")
} else if self.complex_animations > 20 {
Some("Many complex animations may impact rendering performance")
} else if self.large_fonts > 5 {
Some("Large font sizes may cause memory issues")
} else if self.total_events > 1000 {
Some("Very large script - consider splitting into multiple files")
} else {
None
}
}
}