From 4d9095b603bc32f9d590670bfa255b2ddeaeedf6 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 16 Aug 2025 13:26:01 -0700 Subject: [PATCH] Change PreProcessor::supports_renderer to return a Result This changes `PreProcessor::supports_renderer` to return a `Result` in preparation to allow preprocessors to be optional when the command fails. --- .../src/builtin_preprocessors/cmd.rs | 16 +++------------- crates/mdbook-driver/src/mdbook.rs | 4 ++-- crates/mdbook-driver/src/mdbook/tests.rs | 4 ++-- crates/mdbook-preprocessor/src/lib.rs | 4 ++-- examples/nop-preprocessor.rs | 6 +++--- tests/testsuite/preprocessor.rs | 4 ++-- 6 files changed, 14 insertions(+), 24 deletions(-) diff --git a/crates/mdbook-driver/src/builtin_preprocessors/cmd.rs b/crates/mdbook-driver/src/builtin_preprocessors/cmd.rs index 0241a081..c4925893 100644 --- a/crates/mdbook-driver/src/builtin_preprocessors/cmd.rs +++ b/crates/mdbook-driver/src/builtin_preprocessors/cmd.rs @@ -114,24 +114,14 @@ impl Preprocessor for CmdPreprocessor { }) } - fn supports_renderer(&self, renderer: &str) -> bool { + fn supports_renderer(&self, renderer: &str) -> Result { debug!( "Checking if the \"{}\" preprocessor supports \"{}\"", self.name(), renderer ); - let mut cmd = match crate::compose_command(&self.cmd, &self.root) { - Ok(c) => c, - Err(e) => { - warn!( - "Unable to create the command for the \"{}\" preprocessor, {}", - self.name(), - e - ); - return false; - } - }; + let mut cmd = crate::compose_command(&self.cmd, &self.root)?; let outcome = cmd .arg("supports") @@ -153,7 +143,7 @@ impl Preprocessor for CmdPreprocessor { } } - outcome.unwrap_or(false) + Ok(outcome.unwrap_or(false)) } } diff --git a/crates/mdbook-driver/src/mdbook.rs b/crates/mdbook-driver/src/mdbook.rs index 54728bae..19abdd87 100644 --- a/crates/mdbook-driver/src/mdbook.rs +++ b/crates/mdbook-driver/src/mdbook.rs @@ -542,7 +542,7 @@ fn preprocessor_should_run( ) -> Result { // default preprocessors should be run by default (if supported) if cfg.build.use_default_preprocessors && is_default_preprocessor(preprocessor) { - return Ok(preprocessor.supports_renderer(renderer.name())); + return preprocessor.supports_renderer(renderer.name()); } let key = format!("preprocessor.{}.renderers", preprocessor.name()); @@ -552,7 +552,7 @@ fn preprocessor_should_run( Ok(Some(explicit_renderers)) => { Ok(explicit_renderers.iter().any(|name| name == renderer_name)) } - Ok(None) => Ok(preprocessor.supports_renderer(renderer_name)), + Ok(None) => preprocessor.supports_renderer(renderer_name), Err(e) => bail!("failed to get `{key}`: {e}"), } } diff --git a/crates/mdbook-driver/src/mdbook/tests.rs b/crates/mdbook-driver/src/mdbook/tests.rs index 675bfc25..b7399133 100644 --- a/crates/mdbook-driver/src/mdbook/tests.rs +++ b/crates/mdbook-driver/src/mdbook/tests.rs @@ -247,8 +247,8 @@ impl Preprocessor for BoolPreprocessor { unimplemented!() } - fn supports_renderer(&self, _renderer: &str) -> bool { - self.0 + fn supports_renderer(&self, _renderer: &str) -> Result { + Ok(self.0) } } diff --git a/crates/mdbook-preprocessor/src/lib.rs b/crates/mdbook-preprocessor/src/lib.rs index c1aa35ea..64100500 100644 --- a/crates/mdbook-preprocessor/src/lib.rs +++ b/crates/mdbook-preprocessor/src/lib.rs @@ -39,8 +39,8 @@ pub trait Preprocessor { /// particular renderer. /// /// By default, always returns `true`. - fn supports_renderer(&self, _renderer: &str) -> bool { - true + fn supports_renderer(&self, _renderer: &str) -> Result { + Ok(true) } } diff --git a/examples/nop-preprocessor.rs b/examples/nop-preprocessor.rs index 3423b481..488271dc 100644 --- a/examples/nop-preprocessor.rs +++ b/examples/nop-preprocessor.rs @@ -59,7 +59,7 @@ fn handle_supports(pre: &dyn Preprocessor, sub_args: &ArgMatches) -> ! { let renderer = sub_args .get_one::("renderer") .expect("Required argument"); - let supported = pre.supports_renderer(renderer); + let supported = pre.supports_renderer(renderer).unwrap(); // Signal whether the renderer is supported by exiting with 1 or 0. if supported { @@ -105,8 +105,8 @@ mod nop_lib { Ok(book) } - fn supports_renderer(&self, renderer: &str) -> bool { - renderer != "not-supported" + fn supports_renderer(&self, renderer: &str) -> Result { + Ok(renderer != "not-supported") } } diff --git a/tests/testsuite/preprocessor.rs b/tests/testsuite/preprocessor.rs index 17f20876..030b12ea 100644 --- a/tests/testsuite/preprocessor.rs +++ b/tests/testsuite/preprocessor.rs @@ -83,7 +83,7 @@ fn example() -> CmdPreprocessor { fn example_supports_whatever() { let cmd = example(); - let got = cmd.supports_renderer("whatever"); + let got = cmd.supports_renderer("whatever").unwrap(); assert_eq!(got, true); } @@ -92,7 +92,7 @@ fn example_supports_whatever() { fn example_doesnt_support_not_supported() { let cmd = example(); - let got = cmd.supports_renderer("not-supported"); + let got = cmd.supports_renderer("not-supported").unwrap(); assert_eq!(got, false); }