use std::fs::{read_link, read_to_string};
pub(crate) fn get_timezone_inner() -> Result<String, crate::GetTimezoneError> {
etc_localtime().or_else(|_| etc_timezone())
}
fn etc_timezone() -> Result<String, crate::GetTimezoneError> {
let mut contents = read_to_string("/etc/timezone")?;
contents.truncate(contents.trim_end().len());
Ok(contents)
}
fn etc_localtime() -> Result<String, crate::GetTimezoneError> {
const PREFIX: &str = "/usr/share/zoneinfo/";
let mut s = read_link("/etc/localtime")?
.into_os_string()
.into_string()
.map_err(|_| crate::GetTimezoneError::FailedParsingString)?;
if !s.starts_with(PREFIX) {
return Err(crate::GetTimezoneError::FailedParsingString);
}
s.replace_range(..PREFIX.len(), "");
Ok(s)
}