use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::core::Status;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Issue {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assignee: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub branch: Option<String>,
pub created: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub depends_on: Vec<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub epic: Option<String>,
pub id: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session: Option<String>,
pub status: Status,
}
impl Issue {
pub fn new(id: u32) -> Self {
Issue {
assignee: None,
branch: None,
created: Utc::now(),
depends_on: Vec::new(),
epic: None,
id,
session: None,
status: Status::default(),
}
}
pub fn with_epic(id: u32, epic: Option<String>) -> Self {
let mut issue = Self::new(id);
issue.epic = epic;
issue
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_issue() {
let issue = Issue::new(1);
assert_eq!(issue.id, 1);
assert_eq!(issue.status, Status::Open);
assert!(issue.assignee.is_none());
assert!(issue.epic.is_none());
}
#[test]
fn test_issue_with_epic() {
let issue = Issue::with_epic(2, Some("MVP".to_string()));
assert_eq!(issue.epic, Some("MVP".to_string()));
}
}