Skip to content

Commit

Permalink
PrettyPrinter::syntaxes(): Prepare for v1.0.0
Browse files Browse the repository at this point in the history
We can't keep `SyntaxReference` as part of the public API, because that
might prevent us from bumping to syntext 6.0.0 without also bumping bat
to v2.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.
  • Loading branch information
Enselic committed Jun 19, 2022
1 parent f93d650 commit 13276b9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/pretty_printer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use std::io::Read;
use std::path::Path;

use console::Term;
use syntect::parsing::SyntaxReference;

use crate::{
assets::HighlightingAssets,
Expand All @@ -28,6 +27,12 @@ struct ActiveStyleComponents {
snip: bool,
}

#[non_exhaustive]
pub struct Syntax {
pub name: String,
pub file_extensions: Vec<String>,
}

pub struct PrettyPrinter<'a> {
inputs: Vec<Input<'a>>,
config: Config<'a>,
Expand Down Expand Up @@ -240,10 +245,18 @@ impl<'a> PrettyPrinter<'a> {
self.assets.themes()
}

pub fn syntaxes(&self) -> impl Iterator<Item = &SyntaxReference> {
pub fn syntaxes(&self) -> impl Iterator<Item = Syntax> + '_ {
// 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.
Expand Down
16 changes: 16 additions & 0 deletions tests/test_pretty_printer.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use bat::PrettyPrinter;

#[test]
fn syntaxes() {
let printer = PrettyPrinter::new();
let syntaxes: Vec<String> = 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()));
}

0 comments on commit 13276b9

Please sign in to comment.