use std::convert::From; use std::env::args; use std::fs; use std::io::{Error as IOError, Write}; use std::result::Result; use std::string::FromUtf8Error; use orgize::export::{html::Escape, DefaultHtmlHandler, HtmlHandler}; use orgize::{Element, Org}; use slugify::slugify; #[derive(Debug)] enum MyError { IO(IOError), Heading, Utf8(FromUtf8Error), } // From trait is required for custom error type impl From for MyError { fn from(err: IOError) -> Self { MyError::IO(err) } } impl From for MyError { fn from(err: FromUtf8Error) -> Self { MyError::Utf8(err) } } struct MyHtmlHandler(DefaultHtmlHandler); impl HtmlHandler for MyHtmlHandler { fn start(&mut self, mut w: W, element: &Element<'_>) -> Result<(), MyError> { match element { Element::Headline(headline) => { if headline.level > 6 { return Err(MyError::Heading); } else { write!( w, "{2}", headline.level, slugify!(headline.title), Escape(headline.title), )?; } } // fallthrough to default handler _ => self.0.start(w, element)?, } Ok(()) } } fn main() -> Result<(), MyError> { let args: Vec<_> = args().collect(); if args.len() < 2 { eprintln!("Usage: {} ", args[0]); } else { let contents = String::from_utf8(fs::read(&args[1])?)?; let mut writer = Vec::new(); Org::parse(&contents).html_with_handler(&mut writer, MyHtmlHandler(DefaultHtmlHandler))?; println!("{}", String::from_utf8(writer)?); } Ok(()) }