diff options
Diffstat (limited to 'src/page.rs')
-rw-r--r-- | src/page.rs | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/src/page.rs b/src/page.rs index a8d60a5..d84721c 100644 --- a/src/page.rs +++ b/src/page.rs @@ -1,5 +1,4 @@ use crate::directive::{Processed, Toc}; -use crate::error::SiteError; use crate::html::{parse, Content, Element, ElementTag, HtmlPage}; use crate::name::Name; use crate::parser::WikitextParser; @@ -10,6 +9,27 @@ use log::{info, trace}; use std::path::{Path, PathBuf}; use std::time::SystemTime; +#[derive(Debug, thiserror::Error)] +pub enum PageError { + #[error("could not read file: {0}")] + FileRead(PathBuf, #[source] std::io::Error), + + #[error("could not convert input text from {0} to UTF-8")] + Utf8(PathBuf, #[source] std::string::FromUtf8Error), + + #[error(transparent)] + Util(#[from] crate::util::UtilError), + + #[error(transparent)] + Wikitext(#[from] crate::wikitext::WikitextError), + + #[error(transparent)] + Html(#[from] crate::html::HtmlError), + + #[error(transparent)] + Parser(#[from] crate::parser::ParserError), +} + pub struct Page { meta: PageMeta, unprocessed: UnprocessedPage, @@ -24,7 +44,7 @@ impl Page { &self.meta } - pub fn markdown(&self, site: &mut Site) -> Result<MarkdownPage, SiteError> { + pub fn markdown(&self, site: &mut Site) -> Result<MarkdownPage, PageError> { self.unprocessed.process(site) } } @@ -40,12 +60,12 @@ impl WikitextPage { Self { meta, wikitext } } - pub fn read(name: &Name) -> Result<Self, SiteError> { + pub fn read(name: &Name) -> Result<Self, PageError> { info!("input file: {}", name); let src = name.source_path(); - let data = std::fs::read(src).map_err(|e| SiteError::FileRead(src.into(), e))?; - let wikitext = String::from_utf8(data).map_err(|e| SiteError::Utf8(src.into(), e))?; + let data = std::fs::read(src).map_err(|e| PageError::FileRead(src.into(), e))?; + let wikitext = String::from_utf8(data).map_err(|e| PageError::Utf8(src.into(), e))?; let mtime = get_mtime(src)?; let meta = MetaBuilder::default() @@ -75,7 +95,7 @@ pub struct UnprocessedPage { } impl UnprocessedPage { - pub fn new(meta: PageMeta, parser: &mut WikitextParser) -> Result<Self, SiteError> { + pub fn new(meta: PageMeta, parser: &mut WikitextParser) -> Result<Self, PageError> { Ok(Self { meta, snippets: Self::snippets(parser)?, @@ -86,7 +106,7 @@ impl UnprocessedPage { &self.meta } - fn snippets(parser: &mut WikitextParser) -> Result<Vec<Snippet>, SiteError> { + fn snippets(parser: &mut WikitextParser) -> Result<Vec<Snippet>, PageError> { let mut snippets = vec![]; while let Some(snippet) = parser.parse()? { snippets.push(snippet); @@ -94,7 +114,7 @@ impl UnprocessedPage { Ok(snippets) } - pub fn prepare(&self, site: &mut Site) -> Result<(), SiteError> { + pub fn prepare(&self, site: &mut Site) -> Result<(), PageError> { trace!("UnprocessedPage: preparing snippets"); for snippet in self.snippets.iter() { snippet.prepare(site)?; @@ -102,7 +122,7 @@ impl UnprocessedPage { Ok(()) } - pub fn process(&self, site: &mut Site) -> Result<MarkdownPage, SiteError> { + pub fn process(&self, site: &mut Site) -> Result<MarkdownPage, PageError> { let mut meta = self.meta.clone(); let mut processed = vec![]; trace!("UnprocessedPage: processing snippets"); @@ -148,22 +168,20 @@ impl MarkdownPage { &self.meta } - pub fn body_to_html(&self) -> Result<HtmlPage, SiteError> { + pub fn body_to_html(&self) -> Result<HtmlPage, PageError> { let head = Element::new(ElementTag::Head); - let body = parse(self.markdown()) - .map_err(|e| SiteError::PageProblem(self.meta.path().into(), Box::new(e.into())))?; + let body = parse(self.markdown())?; Ok(HtmlPage::new(head, body)) } - pub fn to_html(&self) -> Result<HtmlPage, SiteError> { + pub fn to_html(&self) -> Result<HtmlPage, PageError> { let mut title = Element::new(ElementTag::Title); title.push_child(Content::Text(self.meta.title().into())); let mut head = Element::new(ElementTag::Head); head.push_child(Content::Elt(title)); - let body = parse(self.markdown()) - .map_err(|e| SiteError::PageProblem(self.meta.path().into(), Box::new(e.into())))?; + let body = parse(self.markdown())?; trace!("MarkdownPage::to_html: head={:?}", head); Ok(HtmlPage::new(head, body)) |