use core::str::FromStr;
use time::{Date, Time};
use super::System;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Error {
ParseError,
UnknownSyscall
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Syscall {
Date(Date),
Time(Time),
}
impl FromStr for Syscall {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let t = s.as_bytes()[0];
let s: &str = &s[1..]; match t {
b'D' => Ok(Syscall::Date(Syscall::date_from_str(s)?)),
b'T' => Ok(Syscall::Time(Syscall::time_from_str(s)?)),
_ => Err(Error::UnknownSyscall)
}
}
}
impl Syscall {
pub fn execute(self, system: &mut impl System) {
match self {
Syscall::Date(date) => {
info!("Setting the date to {:?}", date);
system.set_date(&date);
},
Syscall::Time(time) => {
info!("Setting the time to {:?}", time);
system.set_time(&time);
},
}
}
pub fn date_from_str(s: &str) -> Result<Date, Error> {
let mut vals = [0i32; 4];
for (idx, number) in s.split('/').enumerate() {
match number.parse() {
Ok(val) => vals[idx] = val,
Err(e) => {
error!("Failed to convert {} into a integer due to {:?}", number, e);
return Err(Error::ParseError)
}
}
}
Ok(Date::from_calendar_date(vals[3], (vals[2] as u8).try_into().map_err(|_| Error::ParseError)?, vals[1] as u8).map_err(|_| Error::ParseError)?)
}
pub fn time_from_str(s: &str) -> Result<Time, Error> {
let mut vals = [0u8; 3];
for (idx, number) in s.split(':').enumerate() {
match number.parse() {
Ok(val) => vals[idx] = val,
Err(e) => {
error!("Failed to convert {} into a integer due to {:?}", number, e);
return Err(Error::ParseError)
}
}
}
Ok(Time::from_hms(vals[0], vals[1], vals[2]).map_err(|_| Error::ParseError)?)
}
}