mod agents_md;
mod claude_md;
pub(crate) use agents_md::AGENTS_MD;
pub(crate) use claude_md::CLAUDE_MD;
use crate::cli::ExportFormatArg;
pub(crate) struct Emitter {
pub(crate) format: &'static str,
pub(crate) file_name: &'static str,
pub(crate) engine: Option<&'static str>,
}
pub(crate) fn resolve(formats: &[ExportFormatArg]) -> Vec<&'static Emitter> {
let mut out: Vec<&'static Emitter> = Vec::new();
let mut push = |emitter: &'static Emitter| {
if !out.iter().any(|e| std::ptr::eq(*e, emitter)) {
out.push(emitter);
}
};
for format in formats {
match format {
ExportFormatArg::AgentsMd => push(&AGENTS_MD),
ExportFormatArg::ClaudeMd => push(&CLAUDE_MD),
ExportFormatArg::All => {
push(&AGENTS_MD);
push(&CLAUDE_MD);
}
}
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_expands_all_and_dedupes_repeats() {
let all = resolve(&[ExportFormatArg::All]);
assert_eq!(all.len(), 2);
assert_eq!(all[0].format, "agents-md");
assert_eq!(all[1].format, "claude-md");
let repeated = resolve(&[
ExportFormatArg::ClaudeMd,
ExportFormatArg::All,
ExportFormatArg::ClaudeMd,
]);
let labels: Vec<&str> = repeated.iter().map(|e| e.format).collect();
assert_eq!(labels, vec!["claude-md", "agents-md"]);
}
#[test]
fn emitters_pin_file_names_and_engine_gates() {
assert_eq!(AGENTS_MD.file_name, "AGENTS.md");
assert_eq!(AGENTS_MD.engine, None);
assert_eq!(CLAUDE_MD.file_name, "CLAUDE.md");
assert_eq!(CLAUDE_MD.engine, Some("claude"));
}
}