Add DiaryId type
This commit is contained in:
parent
243aeb5e72
commit
41f0f63c67
1 changed files with 188 additions and 0 deletions
188
libimagdiary/src/diaryid.rs
Normal file
188
libimagdiary/src/diaryid.rs
Normal file
|
@ -0,0 +1,188 @@
|
|||
use std::convert::Into;
|
||||
use std::str::FromStr;
|
||||
|
||||
use chrono::naive::datetime::NaiveDateTime;
|
||||
use chrono::naive::time::NaiveTime;
|
||||
use chrono::naive::date::NaiveDate;
|
||||
use chrono::Datelike;
|
||||
use chrono::Timelike;
|
||||
use regex::Regex;
|
||||
|
||||
use libimagstore::storeid::StoreId;
|
||||
use libimagstore::storeid::IntoStoreId;
|
||||
|
||||
use module_path::ModuleEntryPath;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct DiaryId {
|
||||
name: String,
|
||||
year: i32,
|
||||
month: u32,
|
||||
day: u32,
|
||||
hour: u32,
|
||||
minute: u32,
|
||||
}
|
||||
|
||||
impl DiaryId {
|
||||
|
||||
pub fn new(name: String, y: i32, m: u32, d: u32, h: u32, min: u32) -> DiaryId {
|
||||
DiaryId {
|
||||
name: name,
|
||||
year: y,
|
||||
month: m,
|
||||
day: d,
|
||||
hour: h,
|
||||
minute: min,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from_datetime<DT: Datelike + Timelike>(diary_name: String, dt: DT) -> DiaryId {
|
||||
DiaryId::new(diary_name, dt.year(), dt.month(), dt.day(), dt.hour(), dt.minute())
|
||||
}
|
||||
|
||||
pub fn diary_name(&self) -> &String {
|
||||
&self.name
|
||||
}
|
||||
|
||||
pub fn year(&self) -> i32 {
|
||||
self.year
|
||||
}
|
||||
|
||||
pub fn month(&self) -> u32 {
|
||||
self.month
|
||||
}
|
||||
|
||||
pub fn day(&self) -> u32 {
|
||||
self.day
|
||||
}
|
||||
|
||||
pub fn hour(&self) -> u32 {
|
||||
self.hour
|
||||
}
|
||||
|
||||
pub fn minute(&self) -> u32 {
|
||||
self.minute
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl IntoStoreId for DiaryId {
|
||||
|
||||
fn into_storeid(self) -> StoreId {
|
||||
let s : String = self.into();
|
||||
ModuleEntryPath::new(s).into_storeid()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl Into<String> for DiaryId {
|
||||
|
||||
fn into(self) -> String {
|
||||
format!("{}/{}/{}-{}-{}:{}",
|
||||
self.name, self.year, self.month, self.day, self.hour, self.minute)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl Into<NaiveDateTime> for DiaryId {
|
||||
|
||||
fn into(self) -> NaiveDateTime {
|
||||
let d = NaiveDate::from_ymd(self.year, self.month, self.day);
|
||||
let t = NaiveTime::from_hms(self.hour, self.minute, 0);
|
||||
NaiveDateTime::new(d, t)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub trait FromStoreId : Sized {
|
||||
|
||||
fn from_storeid(&StoreId) -> Option<Self>;
|
||||
|
||||
}
|
||||
|
||||
impl FromStoreId for DiaryId {
|
||||
|
||||
fn from_storeid(s: &StoreId) -> Option<DiaryId> {
|
||||
lazy_static! {
|
||||
static ref RE: Regex = Regex::new(r"(?x)
|
||||
(.*)
|
||||
/(?P<name>(.*))
|
||||
/(?P<year>\d{4})
|
||||
/(?P<month>\d{2})
|
||||
-(?P<day>\d{2})
|
||||
-(?P<hour>\d{2})
|
||||
:(?P<minute>\d{2})
|
||||
"
|
||||
).unwrap();
|
||||
}
|
||||
|
||||
s.to_str()
|
||||
.map(|s| { debug!("StoreId = {:?}", s); s })
|
||||
.and_then(|s| RE.captures(s))
|
||||
.and_then(|caps| {
|
||||
let name = caps.at(0);
|
||||
let year = caps.at(1);
|
||||
let month = caps.at(2);
|
||||
let day = caps.at(3);
|
||||
let hour = caps.at(4);
|
||||
let minute = caps.at(5);
|
||||
|
||||
debug!("some? name = {:?}", name.is_some());
|
||||
debug!("some? year = {:?}", year.is_some());
|
||||
debug!("some? month = {:?}", month.is_some());
|
||||
debug!("some? day = {:?}", day.is_some());
|
||||
debug!("some? hour = {:?}", hour.is_some());
|
||||
debug!("some? minute = {:?}", minute.is_some());
|
||||
|
||||
if [name, year, month, day, hour, minute].iter().all(|x| x.is_some()) {
|
||||
let year = {
|
||||
match i32::from_str(year.unwrap()) {
|
||||
Ok(x) => x,
|
||||
Err(_) => return None,
|
||||
}
|
||||
};
|
||||
|
||||
let month = {
|
||||
match u32::from_str(month.unwrap()) {
|
||||
Ok(x) => x,
|
||||
Err(_) => return None,
|
||||
}
|
||||
};
|
||||
|
||||
let day = {
|
||||
match u32::from_str(day.unwrap()) {
|
||||
Ok(x) => x,
|
||||
Err(_) => return None,
|
||||
}
|
||||
};
|
||||
|
||||
let hour = {
|
||||
match u32::from_str(hour.unwrap()) {
|
||||
Ok(x) => x,
|
||||
Err(_) => return None,
|
||||
}
|
||||
};
|
||||
|
||||
let minute = {
|
||||
match u32::from_str(minute.unwrap()) {
|
||||
Ok(x) => x,
|
||||
Err(_) => return None,
|
||||
}
|
||||
};
|
||||
|
||||
Some(DiaryId {
|
||||
name : String::from(name.unwrap()),
|
||||
year : year,
|
||||
month : month,
|
||||
day : day,
|
||||
hour : hour,
|
||||
minute : minute,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in a new issue