use super::Formatter;
use crate::highlight;
use crate::languages::Language;
use derive_builder::Builder;
use lumis_core::formatter::Formatter as _;
use std::io::{self, Write};
#[derive(Builder, Clone, Debug)]
#[builder(default)]
pub struct BBCodeScoped {
lang: Language,
}
impl BBCodeScopedBuilder {
pub fn new() -> Self {
Self::default()
}
}
impl BBCodeScoped {
pub fn new(lang: Language) -> Self {
Self { lang }
}
}
impl Default for BBCodeScoped {
fn default() -> Self {
Self {
lang: Language::PlainText,
}
}
}
impl Formatter for BBCodeScoped {
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::bbcode::BBCodeScoped::new(self.lang);
core_formatter.render(source, &events, output)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_no_attrs() {
let code = "@lang :rust";
let formatter = BBCodeScoped::new(Language::Elixir);
let mut buffer = Vec::new();
formatter.format(code, &mut buffer).unwrap();
let result = String::from_utf8(buffer).unwrap();
assert!(result.contains("@"));
assert!(result.contains("lang"));
assert!(result.contains(":rust"));
}
#[test]
fn test_plain_text() {
let code = "hello world";
let formatter = BBCodeScoped::new(Language::PlainText);
let mut buffer = Vec::new();
formatter.format(code, &mut buffer).unwrap();
let result = String::from_utf8(buffer).unwrap();
assert_eq!(result, "hello world");
}
#[test]
fn test_builder_pattern() {
let formatter = BBCodeScopedBuilder::new()
.lang(Language::Rust)
.build()
.unwrap();
let code = "fn main() {}";
let mut buffer = Vec::new();
formatter.format(code, &mut buffer).unwrap();
let result = String::from_utf8(buffer).unwrap();
assert!(result.contains("fn"));
assert!(result.contains("main"));
}
}