use crate::models::IssueData;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum NotificationEvent {
IssueCreated {
issue_id: String,
issue_data: IssueData,
},
IssueUpdated {
issue_id: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
fields_changed: Vec<String>,
issue_data: IssueData,
},
IssueDeleted { issue_id: String },
IssueFocused {
issue_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
comment_id: Option<String>,
},
UiControl { action: UiControlAction },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum UiControlAction {
ClearFocus,
SetViewMode { mode: String },
SetSearch { query: String },
MaximizeDetail,
RestoreDetail,
CloseDetail,
ToggleSettings,
SetSetting { key: String, value: String },
CollapseColumn { column_name: String },
ExpandColumn { column_name: String },
SelectIssue { issue_id: String },
ReloadPage,
}
impl NotificationEvent {
pub fn issue_id(&self) -> Option<&str> {
match self {
NotificationEvent::IssueCreated { issue_id, .. } => Some(issue_id),
NotificationEvent::IssueUpdated { issue_id, .. } => Some(issue_id),
NotificationEvent::IssueDeleted { issue_id } => Some(issue_id),
NotificationEvent::IssueFocused { issue_id, .. } => Some(issue_id),
NotificationEvent::UiControl { .. } => None,
}
}
pub fn description(&self) -> String {
match self {
NotificationEvent::IssueCreated { issue_id, .. } => {
format!("Issue {} created", issue_id)
}
NotificationEvent::IssueUpdated {
issue_id,
fields_changed,
..
} => {
if fields_changed.is_empty() {
format!("Issue {} updated", issue_id)
} else {
format!("Issue {} updated: {}", issue_id, fields_changed.join(", "))
}
}
NotificationEvent::IssueDeleted { issue_id } => {
format!("Issue {} deleted", issue_id)
}
NotificationEvent::IssueFocused { issue_id, user, .. } => {
if let Some(u) = user {
format!("Issue {} focused by {}", issue_id, u)
} else {
format!("Issue {} focused", issue_id)
}
}
NotificationEvent::UiControl { action } => {
format!("UI control: {:?}", action)
}
}
}
}