use serde::{Deserialize, Serialize};
use crate::analytics::font::{FontStats, FontStatsBuilder};
use crate::analytics::geometry::{GeometryStats, GeometryStatsBuilder};
use crate::analytics::page_roles::{classify_page_roles, PageRolesConfig};
use crate::analytics::page_stats::{PageStats, PageStatsBuilder};
use crate::analytics::region::{RegionStats, RegionStatsBuilder};
use crate::analytics::statistic::{FinalizationContext, Statistic};
use crate::types::PdfTextElement;
#[derive(Debug, Default)]
pub struct AnalysisBuilder {
pub font: FontStatsBuilder,
pub geometry: GeometryStatsBuilder,
pub page_stats: PageStatsBuilder,
pub region: RegionStatsBuilder,
}
impl AnalysisBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn observe(&mut self, element: &PdfTextElement) {
self.font.observe(element);
self.geometry.observe(element);
self.page_stats.observe(element);
self.region.observe(element);
}
pub fn finalize(self) -> DocumentAnalysis {
let empty_ctx = FinalizationContext::default();
let font = self.font.finalize(&empty_ctx);
let geometry_ctx = FinalizationContext {
font: Some(&font),
geometry: None,
region: None,
};
let geometry = self.geometry.finalize(&geometry_ctx);
let region_ctx = FinalizationContext {
font: Some(&font),
geometry: Some(&geometry),
region: None,
};
let region = self.region.finalize(®ion_ctx);
let page_ctx = FinalizationContext {
font: Some(&font),
geometry: Some(&geometry),
region: Some(®ion),
};
let mut page_stats = self.page_stats.finalize(&page_ctx);
classify_page_roles(&mut page_stats, &PageRolesConfig::default());
DocumentAnalysis {
font,
geometry,
page_stats,
region,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DocumentAnalysis {
pub font: FontStats,
pub geometry: GeometryStats,
pub page_stats: PageStats,
pub region: RegionStats,
}