#![forbid(unsafe_code)]
use std::path::PathBuf;
pub const DEFAULT_TZDIR: &str = "/usr/share/zoneinfo";
pub fn resolve(arg: &str, tzdir: Option<&str>) -> Result<PathBuf, String> {
let direct = PathBuf::from(arg);
if direct.is_file() {
return Ok(direct);
}
let base = tzdir
.map(|s| s.to_string())
.or_else(|| std::env::var("TZDIR").ok())
.unwrap_or_else(|| DEFAULT_TZDIR.to_string());
let joined = PathBuf::from(&base).join(arg);
if joined.is_file() {
return Ok(joined);
}
Err(format!(
"could not resolve zone {arg:?}: not a file, and {base}/{arg} does not exist (try --tzif PATH or --tzdir DIR)"
))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolves_explicit_path() {
assert!(resolve("fixtures/UTC.tzif", None).is_ok());
}
#[test]
fn resolves_name_under_tzdir() {
let p = resolve("UTC.tzif", Some("fixtures")).unwrap();
assert!(p.is_file());
}
#[test]
fn unknown_zone_errors() {
assert!(resolve("No/Such/Zone", Some("fixtures")).is_err());
}
}