diff options
Diffstat (limited to 'src/wikitext.rs')
-rw-r--r-- | src/wikitext.rs | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/wikitext.rs b/src/wikitext.rs index b78cd66..4d8578a 100644 --- a/src/wikitext.rs +++ b/src/wikitext.rs @@ -1,11 +1,19 @@ use crate::directive::{Directive, Processed}; -use crate::error::SiteError; use crate::page::PageMeta; use crate::site::Site; use log::trace; use std::collections::HashMap; use std::path::Path; +#[derive(Debug, thiserror::Error)] +pub enum WikitextError { + #[error(transparent)] + Directive(#[from] crate::directive::DirectiveError), + + #[error(transparent)] + Site(#[from] crate::site::SiteError), +} + #[derive(Debug, Eq, PartialEq)] pub enum Snippet { Markdown(String), @@ -14,7 +22,7 @@ pub enum Snippet { } impl Snippet { - pub fn prepare(&self, site: &mut Site) -> Result<(), SiteError> { + pub fn prepare(&self, site: &mut Site) -> Result<(), WikitextError> { trace!("prepare snippet {:?}", self); if let Snippet::Directive(p) = self { trace!("creating directive from parsed directive"); @@ -29,14 +37,16 @@ impl Snippet { Ok(()) } - pub fn process(&self, site: &mut Site, meta: &mut PageMeta) -> Result<Processed, SiteError> { + pub fn process( + &self, + site: &mut Site, + meta: &mut PageMeta, + ) -> Result<Processed, WikitextError> { trace!("Snippet::process: self={:?}", self); let processed = match self { Snippet::Markdown(text) => Processed::Markdown(text.into()), Snippet::WikiLink(w) => { - let resolved = site - .resolve(meta.path(), Path::new(w.target())) - .map_err(|e| SiteError::PageProblem(meta.path().into(), Box::new(e)))?; + let resolved = site.resolve(meta.path(), Path::new(w.target()))?; trace!("resolved {} to {}", w.target(), resolved.display()); let link = format!("[{}]({})", w.link_text(), resolved.display()); Processed::Markdown(link) @@ -44,14 +54,13 @@ impl Snippet { Snippet::Directive(p) => { let e = Directive::try_from(p); if let Ok(d) = e { - d.process(site, meta) - .map_err(|e| SiteError::PageProblem(meta.path().into(), Box::new(e)))? + d.process(site, meta)? } else if let Some(shortcut) = site.shortcut(p.name()) { let arg = p.unnamed_args().first().unwrap().to_string(); let link = format!("[{}]({})", shortcut.desc(&arg), shortcut.url(&arg)); Processed::Markdown(link) } else { - return Err(e.unwrap_err()); + return Err(e.unwrap_err().into()); } } }; @@ -89,7 +98,7 @@ pub struct ParsedDirective { } impl ParsedDirective { - pub fn new(name: &str, args: HashMap<String, String>) -> Result<Self, SiteError> { + pub fn new(name: &str, args: HashMap<String, String>) -> Result<Self, WikitextError> { trace!("ParsedDirective::new: name={:?} args={:?}", name, args); Ok(Self { name: name.into(), |