You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
5 years ago
|
/*
|
||
|
TU - Time's Up!
|
||
|
Copyright (C) 2020 Julio Biason
|
||
|
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU Affero General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU Affero General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Affero General Public License
|
||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
5 years ago
|
use std::cmp::Ordering;
|
||
5 years ago
|
|
||
5 years ago
|
use serde_derive::Deserialize;
|
||
|
use serde_derive::Serialize;
|
||
5 years ago
|
use uuid::Uuid;
|
||
5 years ago
|
|
||
5 years ago
|
use crate::date::Date;
|
||
|
use crate::datetime::DateTime;
|
||
4 years ago
|
use crate::eventtype::EventType;
|
||
5 years ago
|
|
||
5 years ago
|
#[derive(Serialize, Deserialize, Debug)]
|
||
|
pub struct Event {
|
||
5 years ago
|
pub id: String,
|
||
|
pub description: String,
|
||
5 years ago
|
pub due: EventType,
|
||
5 years ago
|
}
|
||
|
|
||
5 years ago
|
/// TODO inject this
|
||
5 years ago
|
fn uuid() -> String {
|
||
|
let (id, _, _, _) = Uuid::new_v4().as_fields();
|
||
|
format!("{:x}", id)
|
||
|
}
|
||
|
|
||
5 years ago
|
#[derive(Debug)]
|
||
|
pub enum EventError {
|
||
|
InvalidDate(String),
|
||
|
TooOld,
|
||
|
}
|
||
|
|
||
5 years ago
|
impl Event {
|
||
5 years ago
|
pub fn new_on_date(description: &str, date: &Date) -> Result<Self, EventError> {
|
||
|
Ok(Self {
|
||
|
id: uuid(),
|
||
|
description: description.into(),
|
||
|
due: EventType::AllDay(date.clone()),
|
||
|
})
|
||
5 years ago
|
}
|
||
5 years ago
|
|
||
5 years ago
|
pub fn new_on_date_time(description: &str, datetime: &DateTime) -> Result<Self, EventError> {
|
||
|
Ok(Self {
|
||
|
id: uuid(),
|
||
|
description: description.into(),
|
||
|
due: EventType::AtTime(datetime.clone()),
|
||
|
})
|
||
5 years ago
|
}
|
||
|
}
|
||
|
|
||
5 years ago
|
impl Eq for Event {}
|
||
|
|
||
|
impl PartialEq for Event {
|
||
|
fn eq(&self, other: &Self) -> bool {
|
||
5 years ago
|
self.due.timestamp() == other.due.timestamp()
|
||
5 years ago
|
}
|
||
|
}
|
||
|
|
||
|
impl Ord for Event {
|
||
|
fn cmp(&self, other: &Self) -> Ordering {
|
||
5 years ago
|
self.due.timestamp().cmp(&other.due.timestamp())
|
||
|
}
|
||
|
}
|
||
5 years ago
|
|
||
5 years ago
|
impl PartialOrd for Event {
|
||
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||
|
Some(self.due.timestamp().cmp(&other.due.timestamp()))
|
||
5 years ago
|
}
|
||
|
}
|