use rich::{Console, Highlighter};
type HighlighterFactory = Box<dyn Fn() -> Box<dyn Highlighter + Send>>;
#[derive(Default)]
pub struct ExtensionRegistry {
highlighters: Vec<HighlighterFactory>,
}
impl ExtensionRegistry {
pub fn new() -> Self {
ExtensionRegistry::default()
}
pub fn with_defaults() -> Self {
let mut registry = ExtensionRegistry::new();
registry.register_highlighter(|| Box::new(crate::highlighter::NumberHighlighter::new()));
registry
}
pub fn register_highlighter<F>(&mut self, factory: F) -> &mut Self
where
F: Fn() -> Box<dyn Highlighter + Send> + 'static,
{
self.highlighters.push(Box::new(factory));
self
}
pub fn install(&self, console: &mut Console) {
for factory in &self.highlighters {
console.add_highlighter(factory());
}
}
}
pub fn install_defaults(console: &mut Console) {
ExtensionRegistry::with_defaults().install(console);
}
#[cfg(test)]
mod tests {
use super::*;
use rich::ColorSystem;
#[test]
fn number_highlighter_installs_and_styles_digits() {
let mut console = Console::builder()
.force_terminal(true)
.color_system(Some(ColorSystem::Truecolor))
.build();
install_defaults(&mut console);
let out = console.render_str_to_string("n=42");
assert!(out.contains("\x1b[1;36m42\x1b[0m"), "got: {out:?}");
}
}