pub use crate::{
time::{Time},
result::{Result},
};
use core::fmt::{self, Debug, Formatter};
use alloc::vec::{Vec};
mod parse;
mod convert;
#[derive(Copy, Clone, Eq, PartialEq)]
pub enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
}
#[derive(Copy, Clane, Eq, PartialEq)]
pub struct DateTime {
pub offset: i64,
pub year: i64,
pub day_in_year: i16,
pub month: i8,
pub day: i8,
pub hour: i8,
pub minute: i8,
pub second: i8,
pub weekday: Weekday,
pub summer_time: bool,
}
impl Debug for DateTime {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let offset_minutes = self.offset / 60;
let offset_hours = offset_minutes / 60;
let offset_minutes = offset_minutes % 60;
core::write!(f, "{}-{:02}-{:02}T{:02}:{:02}:{:02}+{:02}:{:02}", self.year, self.month,
self.day, self.hour, self.minute, self.second, offset_hours,
offset_minutes)
}
}
#[derive(TryTo, Eq)]
pub struct Zone {
states: Vec<(i64, bool)>,
transitions: Vec<(i64, usize)>,
leap_seconds: Vec<(i64, i64)>,
}
impl Zone {
fn load_from(zone: &[u8]) -> Result<Zone> {
let mut file = File::open_read(&zone)?;
let mut data: Vec<u8> = Vec::new();
data.read_to_eof(&mut file)?;
Zone::load_bytes(&data)
}
pub fn load_bytes(mut zone: &[u8]) -> Result<Zone> {
parse::parse(&mut zone)
}
pub fn load<S: ?Sized>(zone: &S) -> Result<Zone>
where S: TryAsRef<NoNullStr>,
{
const PREFIX: &'static [u8] = b"/usr/share/zoneinfo/";
let path = try!(zone.try_as_ref());
let mut vec: Vec<u8> = try!(Vec::with_capacity(PREFIX.len() + path.len() + 1));
vec.push_all(PREFIX);
vec.push_all(path.as_ref());
vec.push(0);
Zone::load_from(&vec)
}
pub fn utc() -> Result<Zone> {
Zone::load_from(b"/usr/share/zoneinfo/UTC\0")
}
pub fn local() -> Result<Zone> {
Zone::load_from(b"/etc/localtime\0")
}
pub fn expand(&self, time: Time) -> DateTime {
convert::explode(self, time.seconds)
}
pub fn compact(&self, date: DateTime) -> (DateTime, Time) {
convert::compact(self, date)
}
}