pub mod content_validator;
pub mod profile_aware_scorer;
pub mod profile_compiler;
pub mod utils;
pub use content_validator::{
ContentAnalysis, ContentPenalty, ContentValidationResult, ContentValidator, ContentViolation,
HeadingAnalysis, MediaAnalysis, SeoAnalysis, TechnicalAnalysis, ViolationSeverity,
WordCountAnalysis,
};
pub use profile_aware_scorer::{
AppliedBonus, AppliedPenalty, ContentComplianceResult, ProfileAwareScorer, ScoringResult,
};
pub use profile_compiler::{
CompiledBonus, CompiledMetricRule, CompiledPenalty, CompiledProfile, ProfileCompiler,
};
pub struct Phase3ScoringSystem {
compiler: ProfileCompiler,
scorer: ProfileAwareScorer,
validator: ContentValidator,
}
impl Phase3ScoringSystem {
pub fn new() -> Self {
Self {
compiler: ProfileCompiler::new(),
scorer: ProfileAwareScorer::new(),
validator: ContentValidator::new(),
}
}
pub fn compiler(&self) -> &ProfileCompiler {
&self.compiler
}
pub fn scorer(&self) -> &ProfileAwareScorer {
&self.scorer
}
pub fn validator(&self) -> &ContentValidator {
&self.validator
}
pub fn compile_profile(
&self,
config: &crate::config::enhanced_models::EnhancedScoringProfile,
) -> Result<CompiledProfile, crate::AnalyzeError> {
self.compiler
.compile_profile(config)
.map_err(|e| crate::AnalyzeError::ConfigError(format!("Compilation failed: {}", e)))
}
pub fn calculate_score(
&self,
_compiled_profile: &CompiledProfile,
metrics: &crate::models::models::PageMetrics,
metadata: &crate::models::models::ExtractedMetadata,
document: &crate::models::models::ProcessedDocument,
) -> Result<ScoringResult, crate::AnalyzeError> {
let mut scorer = self.scorer.clone();
scorer
.calculate_score(metrics, metadata, document)
.map_err(|e| crate::AnalyzeError::ConfigError(format!("Scoring failed: {}", e)))
}
pub fn validate_content(
&self,
expectations: &crate::config::enhanced_models::ContentExpectations,
metrics: &crate::models::models::PageMetrics,
document: &crate::models::models::ProcessedDocument,
) -> Result<ContentValidationResult, content_validator::ContentValidationError> {
self.validator
.validate_content_expectations(expectations, metrics, document)
}
pub fn complete_analysis(
&self,
config: &crate::config::enhanced_models::EnhancedScoringProfile,
metrics: &crate::models::models::PageMetrics,
metadata: &crate::models::models::ExtractedMetadata,
document: &crate::models::models::ProcessedDocument,
) -> Result<CompleteAnalysisResult, Phase3Error> {
let compiled_profile = self
.compile_profile(config)
.map_err(Phase3Error::ConfigError)?;
let scoring_result = self
.calculate_score(&compiled_profile, metrics, metadata, document)
.map_err(Phase3Error::ConfigError)?;
let content_validation = Some(
self.validate_content(&config.content_expectations, metrics, document)
.map_err(Phase3Error::ValidationError)?,
);
Ok(CompleteAnalysisResult {
scoring_result,
content_validation,
compiled_profile,
})
}
}
impl Default for Phase3ScoringSystem {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct CompleteAnalysisResult {
pub scoring_result: ScoringResult,
pub content_validation: Option<ContentValidationResult>,
pub compiled_profile: CompiledProfile,
}
#[derive(Debug, thiserror::Error)]
pub enum Phase3Error {
#[error("Configuration error: {0}")]
ConfigError(#[from] crate::AnalyzeError),
#[error("Content validation error: {0}")]
ValidationError(#[from] content_validator::ContentValidationError),
#[error("Scoring error: {0}")]
ScoringError(String),
}
#[derive(Debug, Clone, Default)]
pub struct Phase3Performance {
pub compilation_time_ms: f64,
pub scoring_time_ms: f64,
pub validation_time_ms: f64,
pub total_time_ms: f64,
pub cache_hit_rate: f64,
pub metrics_processed: usize,
}
impl Phase3Performance {
pub fn new() -> Self {
Default::default()
}
pub fn total_time(&self) -> f64 {
self.compilation_time_ms + self.scoring_time_ms + self.validation_time_ms
}
pub fn efficiency_score(&self) -> f64 {
let total = self.total_time();
if total > 0.0 {
(self.metrics_processed as f64 / total) * 1000.0 } else {
0.0
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_phase3_system_creation() {
let system = Phase3ScoringSystem::new();
assert!(!std::ptr::eq(
system.compiler(),
system.scorer() as *const _ as *const ProfileCompiler
));
}
#[test]
fn test_performance_metrics() {
let mut perf = Phase3Performance::new();
perf.compilation_time_ms = 10.0;
perf.scoring_time_ms = 20.0;
perf.validation_time_ms = 5.0;
perf.metrics_processed = 100;
assert_eq!(perf.total_time(), 35.0);
assert!(perf.efficiency_score() > 0.0);
}
}