use crate::elements::StructureElement;
use crate::error::Result;
use crate::structure::types::{StructChild, StructElem, StructTreeRoot, StructType};
use std::collections::HashMap;
pub struct StructureTreeBuilder {
mcid_counter: u32,
parent_tree_entries: HashMap<u32, HashMap<u32, u32>>,
}
impl StructureTreeBuilder {
pub fn new() -> Self {
Self {
mcid_counter: 0,
parent_tree_entries: HashMap::new(),
}
}
pub fn build(
_content: &HashMap<usize, StructureElement>,
_page_count: usize,
) -> Result<StructTreeRoot> {
Ok(StructTreeRoot::new())
}
fn convert_structure_element(
&mut self,
element: &StructureElement,
_page_index: usize,
) -> Result<StructElem> {
let struct_type = StructType::from_str(&element.structure_type);
let mut elem = StructElem::new(struct_type);
for child in &element.children {
match child {
crate::elements::ContentElement::Structure(nested) => {
let nested_elem = self.convert_structure_element(nested, _page_index)?;
elem.add_child(StructChild::StructElem(Box::new(nested_elem)));
}
_ => {
let mcid = self.mcid_counter;
self.mcid_counter += 1;
elem.add_child(StructChild::MarkedContentRef {
mcid,
page: _page_index as u32,
});
}
}
}
Ok(elem)
}
fn next_mcid(&mut self) -> u32 {
let mcid = self.mcid_counter;
self.mcid_counter += 1;
mcid
}
}
impl Default for StructureTreeBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_creation() {
let _builder = StructureTreeBuilder::new();
}
#[test]
fn test_builder_next_mcid() {
let mut builder = StructureTreeBuilder::new();
assert_eq!(builder.next_mcid(), 0);
assert_eq!(builder.next_mcid(), 1);
assert_eq!(builder.next_mcid(), 2);
}
#[test]
fn test_build_empty() {
let content: HashMap<usize, StructureElement> = HashMap::new();
let result = StructureTreeBuilder::build(&content, 1).unwrap();
assert!(result.root_elements.is_empty());
}
}