const ALIASES: [(&str, &str); 20] = [
("json", "json"),
("jsonc", "json"),
("yaml", "yaml"),
("yml", "yaml"),
("toml", "toml"),
("ini", "ini"),
("cfg", "ini"),
("conf", "ini"),
("properties", "ini"),
("env", "env"),
("dotenv", "env"),
("csv", "csv"),
("tsv", "tsv"),
("log", "log"),
("logs", "log"),
("ndjson", "log"),
("jsonl", "log"),
("txt", FALLBACK_FORMAT),
("text", FALLBACK_FORMAT),
("plaintext", FALLBACK_FORMAT),
];
pub(crate) const SUPPORTED_FORMATS: [&str; 8] =
["json", "yaml", "toml", "ini", "env", "csv", "tsv", "log"];
pub(crate) const FALLBACK_FORMAT: &str = "unknown";
fn normalise(value: &str) -> String {
value.trim().trim_start_matches('.').to_lowercase()
}
pub(crate) fn canonical(format: &str) -> &'static str {
ALIASES
.iter()
.find(|(alias, _)| *alias == format)
.map_or(FALLBACK_FORMAT, |(_, key)| *key)
}
pub(crate) fn resolve_format(format: Option<&str>, filename: Option<&str>) -> &'static str {
if let Some(name) = format {
let direct = canonical(&normalise(name));
if direct != FALLBACK_FORMAT {
return direct;
}
}
let Some(filename) = filename else {
return FALLBACK_FORMAT;
};
let whole = canonical(&normalise(filename));
if whole != FALLBACK_FORMAT {
return whole;
}
filename
.split('.')
.skip(1)
.collect::<Vec<&str>>()
.into_iter()
.rev()
.map(|part| canonical(&normalise(part)))
.find(|key| *key != FALLBACK_FORMAT)
.unwrap_or(FALLBACK_FORMAT)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_offered_format_resolves_to_itself() {
for format in SUPPORTED_FORMATS {
assert_eq!(resolve_format(Some(format), None), format, "{format}");
}
}
#[test]
fn the_offered_list_matches_the_alias_table() {
for format in SUPPORTED_FORMATS {
assert_ne!(format, FALLBACK_FORMAT);
assert!(
ALIASES.iter().any(|(_, key)| *key == format),
"{format} is offered but no alias produces it"
);
}
for (_, key) in ALIASES {
assert!(
SUPPORTED_FORMATS.contains(&key) || key == FALLBACK_FORMAT,
"{key} is produced but not offered"
);
}
}
#[test]
fn aliases_are_honoured() {
for (alias, expected) in [
("jsonc", "json"),
("yml", "yaml"),
("tsv", "tsv"),
("cfg", "ini"),
("conf", "ini"),
("dotenv", "env"),
("jsonl", "log"),
] {
assert_eq!(resolve_format(Some(alias), None), expected, "{alias}");
}
}
#[test]
fn a_name_is_normalised_before_it_is_matched() {
assert_eq!(resolve_format(Some(" JSON "), None), "json");
assert_eq!(resolve_format(Some(".toml"), None), "toml");
}
#[test]
fn a_filename_supplies_the_format_when_none_is_named() {
assert_eq!(resolve_format(None, Some("config.toml")), "toml");
assert_eq!(resolve_format(None, Some("data.CSV")), "csv");
assert_eq!(resolve_format(None, Some("access.log")), "log");
}
#[test]
fn a_dotfile_resolves_by_its_whole_name() {
assert_eq!(resolve_format(None, Some(".env")), "env");
assert_eq!(resolve_format(None, Some("env")), "env");
}
#[test]
fn a_rotated_log_is_still_a_log() {
for name in ["access.log.1", "syslog.log.2026-08-12", "app.log.gz.log"] {
assert_eq!(resolve_format(None, Some(name)), "log", "{name}");
}
}
#[test]
fn anything_unrecognised_falls_back() {
for name in ["terraform", "dockerfile", "", "wat"] {
assert_eq!(resolve_format(Some(name), None), FALLBACK_FORMAT, "{name}");
}
assert_eq!(resolve_format(None, Some("main.tf")), FALLBACK_FORMAT);
assert_eq!(resolve_format(None, Some("Makefile")), FALLBACK_FORMAT);
assert_eq!(resolve_format(None, None), FALLBACK_FORMAT);
}
#[test]
fn an_unresolved_format_defers_to_the_filename() {
assert_eq!(resolve_format(Some("nonsense"), Some("a.toml")), "toml");
}
}