feat: implement Ord for the task model
				
					
				
			This commit is contained in:
		@@ -1,10 +1,12 @@
 | 
			
		||||
use chrono::NaiveDateTime;
 | 
			
		||||
use crate::models::category::Category;
 | 
			
		||||
use crate::models::subtask::Subtask;
 | 
			
		||||
use crate::schema::tasks;
 | 
			
		||||
use crate::utils::reverse_ord_option::ReverseOrdOption;
 | 
			
		||||
use chrono::NaiveDateTime;
 | 
			
		||||
use diesel::prelude::*;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use std::cmp::Ordering;
 | 
			
		||||
use validator::Validate;
 | 
			
		||||
use crate::models::subtask::Subtask;
 | 
			
		||||
 | 
			
		||||
const TITLE_LENGTH_MIN: u64 = 1;
 | 
			
		||||
const TITLE_LENGTH_MAX: u64 = 255;
 | 
			
		||||
@@ -52,6 +54,40 @@ impl Task {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Eq for Task {}
 | 
			
		||||
 | 
			
		||||
impl PartialOrd<Self> for Task {
 | 
			
		||||
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
 | 
			
		||||
        Some(self.cmp(other))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Ord for Task {
 | 
			
		||||
    fn cmp(&self, other: &Self) -> Ordering {
 | 
			
		||||
        match (&self.category, &other.category) {
 | 
			
		||||
            (Category::Inbox, Category::Inbox) => self.created_at.cmp(&other.created_at),
 | 
			
		||||
            (
 | 
			
		||||
                Category::Calendar { date: self_date, time: self_time, .. },
 | 
			
		||||
                Category::Calendar { date: other_date, time: other_time, .. }
 | 
			
		||||
            ) => self_date.cmp(other_date)
 | 
			
		||||
                .then(ReverseOrdOption::from(
 | 
			
		||||
                    &self_time.as_ref().map(|calendar_time| calendar_time.time())
 | 
			
		||||
                ).cmp(&ReverseOrdOption::from(
 | 
			
		||||
                        &other_time.as_ref().map(|calendar_time| calendar_time.time())
 | 
			
		||||
                )))
 | 
			
		||||
                .then(ReverseOrdOption::from(&self.deadline()).cmp(
 | 
			
		||||
                    &ReverseOrdOption::from(&other.deadline())
 | 
			
		||||
                ))
 | 
			
		||||
                .then(self.created_at.cmp(&other.created_at)),
 | 
			
		||||
            (Category::Done, Category::Done) | (Category::Trash, Category::Trash)
 | 
			
		||||
            => self.updated_at.cmp(&other.updated_at).reverse(),
 | 
			
		||||
            (_, _) => ReverseOrdOption::from(&self.deadline()).cmp(
 | 
			
		||||
                &ReverseOrdOption::from(&other.deadline())
 | 
			
		||||
            ).then(self.created_at.cmp(&other.created_at)),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
 | 
			
		||||
pub struct TaskWithSubtasks {
 | 
			
		||||
    task: Task,
 | 
			
		||||
@@ -72,6 +108,20 @@ impl TaskWithSubtasks {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Eq for TaskWithSubtasks {}
 | 
			
		||||
 | 
			
		||||
impl PartialOrd<Self> for TaskWithSubtasks {
 | 
			
		||||
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
 | 
			
		||||
        Some(self.cmp(other))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Ord for TaskWithSubtasks {
 | 
			
		||||
    fn cmp(&self, other: &Self) -> Ordering {
 | 
			
		||||
        self.task().cmp(other.task())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Insertable, Serialize, Deserialize, Validate, Clone, Debug)]
 | 
			
		||||
#[diesel(table_name = tasks)]
 | 
			
		||||
pub struct NewTask {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user