use std::collections::HashMap;
use crate::objects::{PdfObject, PdfRef};
#[derive(Debug, Default)]
pub struct PdfContext {
objects: HashMap<PdfRef, PdfObject>,
next_object_number: u32,
svg_resource_counter: u32,
}
impl PdfContext {
pub fn new() -> Self {
PdfContext {
objects: HashMap::new(),
next_object_number: 1, svg_resource_counter: 0,
}
}
pub fn next_svg_resource_name(&mut self, prefix: &str) -> String {
self.svg_resource_counter += 1;
format!("{}{}", prefix, self.svg_resource_counter)
}
pub fn alloc_ref(&mut self) -> PdfRef {
let ref_id = PdfRef::new(self.next_object_number);
self.next_object_number += 1;
ref_id
}
pub fn register(&mut self, object: PdfObject) -> PdfRef {
let ref_id = self.alloc_ref();
self.objects.insert(ref_id, object);
ref_id
}
pub fn assign(&mut self, ref_id: PdfRef, object: PdfObject) {
self.objects.insert(ref_id, object);
}
pub fn lookup(&self, ref_id: PdfRef) -> Option<&PdfObject> {
self.objects.get(&ref_id)
}
pub fn lookup_mut(&mut self, ref_id: PdfRef) -> Option<&mut PdfObject> {
self.objects.get_mut(&ref_id)
}
pub fn delete(&mut self, ref_id: PdfRef) -> Option<PdfObject> {
self.objects.remove(&ref_id)
}
pub fn len(&self) -> usize {
self.objects.len()
}
pub fn is_empty(&self) -> bool {
self.objects.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (&PdfRef, &PdfObject)> {
self.objects.iter()
}
pub fn to_vec(&self) -> Vec<(PdfRef, PdfObject)> {
self.objects.iter().map(|(&r, o)| (r, o.clone())).collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::objects::PdfName;
#[test]
fn test_context_alloc() {
let mut ctx = PdfContext::new();
let ref1 = ctx.alloc_ref();
let ref2 = ctx.alloc_ref();
assert_eq!(ref1.object_number(), 1);
assert_eq!(ref2.object_number(), 2);
}
#[test]
fn test_context_register() {
let mut ctx = PdfContext::new();
let obj = PdfObject::Name(PdfName::new("Test"));
let ref_id = ctx.register(obj.clone());
assert_eq!(ctx.lookup(ref_id), Some(&obj));
}
#[test]
fn test_context_assign() {
let mut ctx = PdfContext::new();
let ref_id = ctx.alloc_ref();
let obj = PdfObject::Integer(42);
ctx.assign(ref_id, obj.clone());
assert_eq!(ctx.lookup(ref_id), Some(&obj));
}
}