use super::Formatter;
use crate::highlight;
use crate::languages::Language;
use crate::themes::Theme;
use derive_builder::Builder;
use lumis_core::formatter::Formatter as _;
use std::io::{self, Write};
#[derive(Builder, Clone, Debug)]
#[builder(default)]
pub struct Terminal {
lang: Language,
theme: Option<Theme>,
}
impl TerminalBuilder {
pub fn new() -> Self {
Self::default()
}
}
impl Terminal {
pub fn new(lang: Language, theme: Option<Theme>) -> Self {
Self { lang, theme }
}
}
impl Default for Terminal {
fn default() -> Self {
Self {
lang: Language::PlainText,
theme: None,
}
}
}
impl Formatter for Terminal {
fn format(&self, source: &str, output: &mut dyn Write) -> io::Result<()> {
let events = highlight::highlight_events(source, self.lang).map_err(io::Error::other)?;
let core_formatter =
lumis_core::formatter::terminal::Terminal::new(self.lang, self.theme.clone());
core_formatter.render(source, &events, output)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_no_attrs() {
let code = "@lang :rust";
let formatter = Terminal::new(Language::Elixir, None);
let mut buffer = Vec::new();
formatter.format(code, &mut buffer).unwrap();
let result = String::from_utf8_lossy(&buffer);
assert!(result.contains("@"));
assert!(result.contains("lang"));
assert!(result.contains(":rust"));
}
}