Merge pull request #18 from storytold/pr/never-crash-organize

Never crash: organize has no expect/unreachable
This commit is contained in:
Brandon Thomas authored and GitHub committed 2026-10-04 14:47:26 -04:00
commit 0133cb7454
4 files changed
+9 -4

No files matched your search

+3 -2
View File
@@ -562,6 +562,7 @@ fn add_outline(doc: &mut Document, marks: &[Mark<'_>]) -> Result<(), OrganizeErr
}
let outlines = doc.add(Object::Null);
let items: Vec<ObjRef> = marks.iter().map(|_| doc.add(Object::Null)).collect();
let (Some(&first_item), Some(&last_item)) = (items.first(), items.last()) else { return Ok(()) };
for (i, ((title, page, src, page_map), r)) in marks.iter().zip(&items).enumerate() {
let mut d = Dict::new();
d.set(b"Title".to_vec(), Object::String(printcraft_cos::PdfString::text(title)));
@@ -589,8 +590,8 @@ fn add_outline(doc: &mut Document, marks: &[Mark<'_>]) -> Result<(), OrganizeErr
}
let mut o = Dict::new();
o.set(b"Type".to_vec(), Object::name("Outlines"));
o.set(b"First".to_vec(), Object::Ref(items[0]));
o.set(b"Last".to_vec(), Object::Ref(*items.last().expect("non-empty")));
o.set(b"First".to_vec(), Object::Ref(first_item));
o.set(b"Last".to_vec(), Object::Ref(last_item));
o.set(b"Count".to_vec(), Object::Int(items.len() as i64));
doc.set(outlines, Object::Dict(o));
let root = doc.root().ok_or(OrganizeError::NoPageTree)?;
+2 -1
View File
@@ -212,7 +212,8 @@ pub fn number_pages(doc: &mut Document, from: usize, to: usize, style: LabelStyl
if old.first().is_none_or(|r| r.start > 0) {
old.insert(0, default_range());
}
let at = |p: usize| old.iter().rev().find(|r| r.start <= p).cloned().expect("a range starts at 0");
// `old` starts at page 0, so a range is always found.
let at = |p: usize| old.iter().rev().find(|r| r.start <= p).cloned().unwrap_or_else(default_range);
let mut ranges: Vec<LabelRange> = old.iter().filter(|r| r.start < from).cloned().collect();
ranges.push(LabelRange { start: from, style, prefix: prefix.to_string(), first: first.max(1) });
if to + 1 < n {
+2
View File
@@ -9,6 +9,8 @@
//! save drops them; an incremental save leaves them untouched). Flat trees are valid for any
//! page count and are what most producers write for small documents.
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
use printcraft_cos::{Dict, Document, ObjRef, Object, PdfString};
mod boxes;
+2 -1
View File
@@ -112,7 +112,8 @@ fn resolve_path(doc: &Document, path: &[usize]) -> Result<(ObjRef, ObjRef)> {
}
parent = r;
}
unreachable!("the loop returns on the last index")
// The loop returns on the last index.
Err(OutlineError::NoSuchBookmark(path.to_vec()))
}
/// The object that holds children at `parent_path` (`[]` = the outline root, created if needed).