use std::fmt;
use std::path::PathBuf;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Status {
#[default]
Open,
Closed,
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Open => write!(f, "open"),
Self::Closed => write!(f, "closed"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Priority {
Low,
#[default]
Medium,
High,
Critical,
}
impl fmt::Display for Priority {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Low => write!(f, "low"),
Self::Medium => write!(f, "medium"),
Self::High => write!(f, "high"),
Self::Critical => write!(f, "critical"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Assignment {
pub session: String,
pub acquired_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GithubRef {
pub repo: String,
pub number: u64,
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IssueMeta {
pub id: u32,
pub title: String,
#[serde(default)]
pub status: Status,
#[serde(default)]
pub priority: Priority,
#[serde(default)]
pub labels: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assignee: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub closed_at: Option<DateTime<Utc>>,
#[serde(default)]
pub sessions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assigned_to: Option<Assignment>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub github: Option<GithubRef>,
}
#[derive(Debug, Clone)]
pub struct Issue {
pub meta: IssueMeta,
pub body: String,
pub path: Option<PathBuf>,
}
impl Issue {
pub fn list_badge(&self) -> String {
let lock = if self.meta.assigned_to.is_some() {
"▣ "
} else {
""
};
format!("{}{}", lock, self.meta.status)
}
}
#[derive(Debug, Clone, Default)]
pub struct IssuePatch {
pub title: Option<String>,
pub body: Option<String>,
pub status: Option<Status>,
pub priority: Option<Priority>,
pub labels: Option<Vec<String>>,
}