diff --git a/src/doc.rs b/src/doc.rs index 9776321..da47a9e 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -48,7 +48,7 @@ pub struct NavPoint { /// nested navpoints pub children: Vec, /// the order in the toc - pub play_order: usize, + pub play_order: Option, } impl Ord for NavPoint { @@ -983,7 +983,9 @@ impl EpubDoc { if item.name.local_name != "navPoint" { continue; } - let play_order = item.get_attr("playOrder").and_then(|n| n.parse().ok()); + let play_order = item + .get_attr("playOrder") + .and_then(|n| n.parse::().ok()); let content = item .find("content") .and_then(|c| c.borrow().get_attr("src").map(|p| self.root_base.join(p))); @@ -995,12 +997,12 @@ impl EpubDoc { .and_then(|t| t.borrow().text.clone()) }); - if let (Some(o), Some(c), Some(l)) = (play_order, content, label) { + if let (order, Some(content_path), Some(label_text)) = (play_order, content, label) { let navpoint = NavPoint { - label: l.clone(), - content: c.clone(), + label: label_text.clone(), + content: content_path.clone(), children: self.get_navpoints(&item), - play_order: o, + play_order: order, }; navpoints.push(navpoint); } diff --git a/tests/doc.rs b/tests/doc.rs index 6acc79d..3626e60 100644 --- a/tests/doc.rs +++ b/tests/doc.rs @@ -131,7 +131,7 @@ fn toc_test() { for nav in doc.toc.iter() { let chapter = doc.resource_uri_to_chapter(&nav.content); assert!(chapter.is_some()); - assert_eq!(nav.play_order, chapter.unwrap()); + assert_eq!(nav.play_order.unwrap(), chapter.unwrap()); } } @@ -144,6 +144,24 @@ fn toc_title_test() { assert!(doc.toc_title == "Todo es mío"); } +#[test] +fn test_toc_play_order() { + let doc = EpubDoc::new("test.epub"); + assert!(doc.is_ok()); + let doc = doc.unwrap(); + + assert!(!doc.toc.is_empty()); + let mut previous_order = None; + for nav in doc.toc.iter() { + nav.play_order.map(|order| { + if let Some(prev) = previous_order { + assert!(prev < order, "Play order is not increasing"); + } + previous_order = Some(order); + }); + } +} + #[test] fn version_test() { let doc = EpubDoc::new("test.epub");