1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//! Project related structures
use types::*;
use uuid::Uuid;

use command;

#[derive(Deserialize, Serialize, Default, Debug, Clone)]
#[serde(default)]

/// A Todoist Project
pub struct Project {
    /// The project's unique ID
    pub id    : ID,

    /// The project's name
    pub name  : String,

    /// The project's Color
    pub color : Color,

    /// The project's indent (hierarchy level) is a number between from 1-4
    pub indent : u8,

    /// This project's position in the project list, the smallest number should be at the top
    pub item_order : isize,

    /// Whether this project's child's project's children are visible
    pub collapsed : IntBool,

    pub shared : bool,

    // 1 if this project has been marked as deleted
    pub is_deleted : IntBool,

    // 1 if this project has been marked as archived
    pub is_archived :IntBool,

    // 1 if this project has been marked as a favorite
    pub is_favorite : IntBool,

    /// True if this project is in the user's inbox
    pub inbox : bool,

    /// True if this project is in the team's inbox
    pub inbox_team : bool,
}

impl command::Create for Project {
    fn create(self) -> command::Command {
        command::Command {
            typ: "project_add".to_string(),
            args: Box::new(
                command::project::Create {
                    name:        self.name,
                    color:       self.color,
                    indent:      self.indent,
                    item_order:  self.item_order,
                    is_favorite: self.is_favorite,
                }
            ),
            uuid:    Uuid::new_v4(),
            temp_id: Some(Uuid::new_v4()),
        }
    }
}

impl command::Update for Project {
    fn update(self) -> command::Command {
        command::Command {
            typ: "project_update".to_string(),
            args: Box::new(
                command::project::Update {
                    name:        self.name,
                    id:          self.id,
                    color:       self.color,
                    indent:      self.indent,
                    item_order:  self.item_order,
                    collapsed:   self.collapsed,
                    is_favorite: self.is_favorite,
                }
            ),
            uuid:    Uuid::new_v4(),
            temp_id: None,
        }
    }
}

impl command::Delete for Project {
    fn delete(self) -> command::Command {
        command::Command {
            typ: "project_delete".to_string(),
            args: Box::new(
                command::Identity {
                    ids: vec![self.id],
                }
            ),
            uuid:    Uuid::new_v4(),
            temp_id: None,
        }
    }
}


impl command::Archive for Project {
    fn archive(self) -> command::Command {
        command::Command {
            typ: "project_archive".to_string(),
            args: Box::new(
                command::Identity {
                    ids: vec![self.id],
                }
            ),
            uuid:    Uuid::new_v4(),
            temp_id: None,
        }
    }

    fn unarchive(self) -> command::Command {
        command::Command {
            typ: "project_unarchive".to_string(),
            args: Box::new(
                command::Identity {
                    ids: vec![self.id],
                }
            ),
            uuid:    Uuid::new_v4(),
            temp_id: None,
        }
    }
}