From 49875d6ce787213ad282a8168dc5e981b4bb1b6a Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Sat, 3 Sep 2022 12:33:38 +0200 Subject: [PATCH] Make `bat::PrettyPrinter::syntaxes()` iterate over new `bat::Syntax` struct (#2222) We can't keep `syntect::parsing::SyntaxReference` as part of the public API, because that might prevent us from bumping to syntect 6.0.0 without also bumping bat to v2.0.0, once we reach v1.0.0. So introduce a new stripped down struct `Syntax` and return that instead. Let it be fully owned to make the API simple. It is not going to be in a hot code path anyway. I have looked at all code of our 27 dependents but I can't find a single instance of this method being used, so this change should be safe for v1.0.0. --- CHANGELOG.md | 2 ++ src/lib.rs | 2 +- src/pretty_printer.rs | 19 ++++++++++++++++--- tests/test_pretty_printer.rs | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 tests/test_pretty_printer.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 7abd4056..052b5a43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ ## `bat` as a library +- Make `bat::PrettyPrinter::syntaxes()` iterate over new `bat::Syntax` struct instead of `&syntect::parsing::SyntaxReference`. See #2222 (@Enselic) + # v0.21.0 diff --git a/src/lib.rs b/src/lib.rs index 02e1fefc..4e3fcb95 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,7 +48,7 @@ pub(crate) mod syntax_mapping; mod terminal; pub(crate) mod wrapping; -pub use pretty_printer::{Input, PrettyPrinter}; +pub use pretty_printer::{Input, PrettyPrinter, Syntax}; pub use syntax_mapping::{MappingTarget, SyntaxMapping}; pub use wrapping::WrappingMode; diff --git a/src/pretty_printer.rs b/src/pretty_printer.rs index 57097a6f..28644513 100644 --- a/src/pretty_printer.rs +++ b/src/pretty_printer.rs @@ -2,7 +2,6 @@ use std::io::Read; use std::path::Path; use console::Term; -use syntect::parsing::SyntaxReference; use crate::{ assets::HighlightingAssets, @@ -28,6 +27,12 @@ struct ActiveStyleComponents { snip: bool, } +#[non_exhaustive] +pub struct Syntax { + pub name: String, + pub file_extensions: Vec, +} + pub struct PrettyPrinter<'a> { inputs: Vec>, config: Config<'a>, @@ -240,10 +245,18 @@ impl<'a> PrettyPrinter<'a> { self.assets.themes() } - pub fn syntaxes(&self) -> impl Iterator { + pub fn syntaxes(&self) -> impl Iterator + '_ { // We always use assets from the binary, which are guaranteed to always // be valid, so get_syntaxes() can never fail here - self.assets.get_syntaxes().unwrap().iter() + self.assets + .get_syntaxes() + .unwrap() + .iter() + .filter(|s| !s.hidden) + .map(|s| Syntax { + name: s.name.clone(), + file_extensions: s.file_extensions.clone(), + }) } /// Pretty-print all specified inputs. This method will "use" all stored inputs. diff --git a/tests/test_pretty_printer.rs b/tests/test_pretty_printer.rs new file mode 100644 index 00000000..2ddfc7d5 --- /dev/null +++ b/tests/test_pretty_printer.rs @@ -0,0 +1,16 @@ +use bat::PrettyPrinter; + +#[test] +fn syntaxes() { + let printer = PrettyPrinter::new(); + let syntaxes: Vec = printer.syntaxes().map(|s| s.name).collect(); + + // Just do some sanity checking + assert!(syntaxes.contains(&"Rust".to_string())); + assert!(syntaxes.contains(&"Java".to_string())); + assert!(!syntaxes.contains(&"this-language-does-not-exist".to_string())); + + // This language exists but is hidden, so we should not see it; it shall + // have been filtered out before getting to us + assert!(!syntaxes.contains(&"Git Common".to_string())); +}