use crate::{
error::{PassengerError, Result},
model::{FileReport, ScaffoldOutput, ScaffoldRequest, UsedSymbols},
plans::HeaderPlan, scaffolds::ScaffoldPlan,
};
use std::path::Path;
pub trait LanguagePack: Send + Sync {
fn id(&self) -> &'static str;
fn matches_path(&self, path: &Path) -> bool;
fn detect_usage(&self, content: &str) -> UsedSymbols;
fn render_header(&self, plan: &dyn HeaderPlan, report: &FileReport) -> String;
fn apply_header(&self, original: &str, header: &str) -> String;
fn scaffold(&self, _plan: &dyn ScaffoldPlan, _req: ScaffoldRequest) -> Result<ScaffoldOutput> {
Err(PassengerError::Unsupported("scaffold not supported by this pack".into()))
}
}
#[cfg(feature = "lang_rust")]
pub mod rust;
pub fn get_pack(lang: &str) -> Result<Box<dyn LanguagePack>> {
match lang {
#[cfg(feature = "lang_rust")]
"rust" | "rs" => Ok(Box::new(rust::RustPack::default())),
_ => Err(PassengerError::Unsupported(format!("language pack '{lang}' not available"))),
}
}