1use chrono::NaiveDateTime;
2
3#[derive(Debug, PartialEq, Eq, Default)]
4pub enum AssignmentSubmitState {
5 #[default]
6 Todo,
7 Done,
8}
9
10#[derive(Debug, PartialEq, Eq, Default)]
11pub enum AssignmentReceptibleState {
12 #[default]
13 NotStarted,
14 Open,
15 Closed,
16}
17
18#[derive(Debug)]
19pub struct AssignmentDate {
20 pub date: NaiveDateTime,
21 pub importance_level: AssignmentImportanceLevel,
22}
23
24#[derive(Debug, PartialEq, Eq)]
25pub enum AssignmentImportanceLevel {
26 None,
27 Low,
28 Medium,
29 High,
30}
31
32impl AssignmentDate {
33 pub fn new(date: &str) -> Self {
34 const DATE_FORMAT: &str = "%Y-%m-%d %H:%M";
35 let date = NaiveDateTime::parse_from_str(date, DATE_FORMAT).unwrap();
36 let importance_level = AssignmentImportanceLevel::from(date);
37
38 AssignmentDate {
39 date,
40 importance_level,
41 }
42 }
43}
44
45impl From<NaiveDateTime> for AssignmentImportanceLevel {
46 fn from(date: NaiveDateTime) -> Self {
47 let today: chrono::NaiveDate = chrono::Local::now().date_naive();
48 let due_date: chrono::NaiveDate = date.date();
49
50 if due_date < today {
51 AssignmentImportanceLevel::None
52 } else {
53 let tomorrow = today + chrono::Duration::days(1);
54 let one_week_later = today + chrono::Duration::days(7);
55
56 if due_date <= tomorrow {
57 AssignmentImportanceLevel::High
58 } else if due_date <= one_week_later {
59 AssignmentImportanceLevel::Medium
60 } else {
61 AssignmentImportanceLevel::Low
62 }
63 }
64 }
65}