#![no_std]
#![forbid(unsafe_code)]
mod error;
mod meta;
mod parse;
mod posix;
mod zipstore;
pub use error::Error;
pub use meta::{meta, parse_iso6709, Country, ZoneMeta};
pub use parse::{parse, LeapSecond, RangeTransition, Transition, Zone, ZoneType};
pub use posix::{parse_posix_tz, PosixTz, RuleKind, TransitionRule};
pub(crate) static ZONEINFO_ZIP: &[u8] = include_bytes!("../zoneinfo.zip");
pub fn load(name: &str) -> Result<Zone<'static>, Error> {
let query = if name.is_empty() { "UTC" } else { name };
let (canonical, data) = zipstore::find_named(ZONEINFO_ZIP, query)?;
parse(canonical, data)
}
pub fn load_insensitive(name: &str) -> Result<Zone<'static>, Error> {
if let Ok(z) = load(name) {
return Ok(z);
}
for canonical in names() {
if canonical.eq_ignore_ascii_case(name) {
return load(canonical);
}
}
Err(Error::NotFound)
}
pub fn names() -> impl Iterator<Item = &'static str> {
zipstore::names(ZONEINFO_ZIP)
}
impl Zone<'_> {
pub fn meta(&self) -> Option<ZoneMeta<'static>> {
meta(self.name())
}
}