const ALIASES: [(&str, &str); 12] = [
("json", "json"),
("jsonc", "json"),
("yaml", "yaml"),
("yml", "yaml"),
("csv", "csv"),
("tsv", "csv"),
("toml", "toml"),
("ini", "ini"),
("cfg", "ini"),
("conf", "ini"),
("env", "env"),
("dotenv", "env"),
];
pub(crate) const SUPPORTED_FORMATS: [&str; 6] = ["json", "yaml", "csv", "toml", "ini", "env"];
pub(crate) const FALLBACK_FORMAT: &str = "unknown";
fn normalise(value: &str) -> String {
value
.trim()
.to_lowercase()
.trim_start_matches('.')
.to_string()
}
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
.rsplit_once('.')
.map_or(FALLBACK_FORMAT, |(_, extension)| {
canonical(&normalise(extension))
})
}
#[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_extensions_aliases_are_honoured() {
for (alias, expected) in [
("jsonc", "json"),
("yml", "yaml"),
("tsv", "csv"),
("cfg", "ini"),
("conf", "ini"),
("dotenv", "env"),
] {
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");
}
#[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 anything_unrecognised_falls_back() {
for name in ["typescript", "rust", "", "wat"] {
assert_eq!(resolve_format(Some(name), None), FALLBACK_FORMAT, "{name}");
}
assert_eq!(resolve_format(None, Some("main.rs")), 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");
}
#[test]
fn the_offered_list_matches_the_alias_table() {
for format in SUPPORTED_FORMATS {
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} is produced but not offered"
);
}
}
}