diff --git a/src/lib.rs b/src/lib.rs index 67d9dd9..adb3be6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2016,7 +2016,7 @@ struct Parser<'ctx> { } #[derive(Debug)] -struct Error(String, Backtrace); +pub struct Error(String, Backtrace); impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -2026,6 +2026,8 @@ impl fmt::Display for Error { } } +impl std::error::Error for Error {} + trait IntoError: fmt::Display {} impl From for Error { @@ -3831,10 +3833,22 @@ fn main_inner() -> Result<(), Error> { } else { None }; + + std::fs::write( + "powerisa-instructions.xml", + parse_powerisa_pdf_and_generate_xml(&args[1], page_numbers, dump_mupdf_page_xml)?, + )?; + Ok(()) +} + +pub fn parse_powerisa_pdf_and_generate_xml( + file_name: &str, + page_numbers: Option>>>, + dump_mupdf_page_xml: bool, +) -> Result { mupdf_ffi::Context::with(|ctx| { let mut parser = Parser::new(); let is_subset = page_numbers.is_some(); - let file_name = &args[1]; parser.parse_pdf(ctx, file_name, page_numbers, dump_mupdf_page_xml)?; let mut insns = xml_tree::Element::new( "instructions".into(), @@ -3858,16 +3872,15 @@ fn main_inner() -> Result<(), Error> { } let mut output = Vec::new(); insns.write(&mut output, true)?; - std::fs::write("powerisa-instructions.xml", output)?; - Ok(()) + Ok(String::from_utf8(output).expect("known to generate valid utf-8")) }) } -fn main() -> std::process::ExitCode { +pub fn main() -> std::process::ExitCode { match main_inner() { Ok(()) => std::process::ExitCode::SUCCESS, Err(e) => { - println!("Error: {e}"); + eprintln!("Error: {e}"); std::process::ExitCode::FAILURE } } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..23e46da --- /dev/null +++ b/src/main.rs @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// See Notices.txt for copyright information + +fn main() -> std::process::ExitCode { + parse_powerisa_pdf::main() +}