use serde::{Deserialize, Serialize};
use super::common::{Gid, ResourceRef, StatusColor, UserRef};
use super::custom_field::CustomFieldSetting;
use super::status_update::StatusUpdateRef;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Project {
pub gid: Gid,
pub name: String,
pub color: Option<String>,
#[serde(default)]
pub archived: bool,
#[serde(default)]
pub public: bool,
pub owner: Option<UserRef>,
pub team: Option<ResourceRef>,
pub workspace: Option<ResourceRef>,
pub current_status_update: Option<StatusUpdateRef>,
pub current_status: Option<StatusUpdateRef>,
pub notes: Option<String>,
pub html_notes: Option<String>,
pub created_at: Option<String>,
pub modified_at: Option<String>,
pub due_date: Option<String>,
pub due_on: Option<String>,
pub start_on: Option<String>,
pub default_view: Option<String>,
#[serde(default)]
pub is_template: bool,
pub permalink_url: Option<String>,
pub icon: Option<String>,
#[serde(default)]
pub custom_field_settings: Vec<CustomFieldSetting>,
}
impl Project {
pub fn status_color(&self) -> StatusColor {
self.current_status_update
.as_ref()
.or(self.current_status.as_ref())
.and_then(|s| s.status_type)
.unwrap_or_default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_project() {
let json = r#"{
"gid": "123",
"name": "My Project",
"archived": false,
"public": true,
"notes": "Project description"
}"#;
let project: Project = serde_json::from_str(json).unwrap();
assert_eq!(project.gid, "123");
assert_eq!(project.name, "My Project");
assert!(!project.archived);
assert!(project.public);
}
#[test]
fn test_project_status_color() {
let json = r#"{
"gid": "123",
"name": "My Project",
"current_status_update": {
"gid": "456",
"title": "On Track",
"status_type": "green"
}
}"#;
let project: Project = serde_json::from_str(json).unwrap();
assert_eq!(project.status_color(), StatusColor::Green);
}
#[test]
fn test_project_status_color_default() {
let json = r#"{
"gid": "123",
"name": "My Project"
}"#;
let project: Project = serde_json::from_str(json).unwrap();
assert_eq!(project.status_color(), StatusColor::None);
}
}