use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct Config {
#[serde(default)]
pub jira: JiraConfig,
#[serde(default)]
pub cache: CacheConfig,
#[serde(default)]
pub teams: Vec<TeamRef>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct TeamRef {
pub id: String,
pub path: String,
pub file: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct TeamJiraOverride {
pub base_url: Option<String>,
pub default_project: Option<String>,
pub email: Option<String>,
pub credential_command: Option<String>,
pub credential_store: Option<String>,
pub credential_key: Option<String>,
pub auth_method: Option<String>,
pub oauth_client_id: Option<String>,
pub oauth_client_secret: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct TeamConfig {
#[serde(default)]
pub jira: Option<TeamJiraOverride>,
#[serde(default)]
pub sources: Vec<SourceConfig>,
#[serde(default)]
pub list: ListConfig,
#[serde(default)]
pub hide_for_a_day: HideForADayConfig,
#[serde(default)]
pub views: HashMap<String, CustomViewConfig>,
}
#[derive(Debug, Clone)]
pub struct ResolvedTeam {
pub id: String,
pub path: String,
pub config: TeamConfig,
pub jira: JiraConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct JiraConfig {
pub base_url: String,
pub default_project: String,
pub email: Option<String>,
pub credential_command: Option<String>,
pub credential_store: Option<String>,
pub credential_key: Option<String>,
pub auth_method: Option<String>,
pub oauth_client_id: Option<String>,
pub oauth_client_secret: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SourceConfig {
pub id: String,
pub display_name: Option<String>,
pub jql: String,
pub expected_project: Option<String>,
pub order_within: Option<String>,
#[serde(default)]
pub allow_hide_for_a_day: bool,
pub view_mode: Option<String>,
pub indication: Option<SourceIndication>,
#[serde(default)]
pub subsources: Vec<SubsourceConfig>,
#[serde(default)]
pub badges: Vec<String>,
}
impl SourceConfig {
pub fn display_name(&self) -> &str {
self.display_name.as_deref().unwrap_or(&self.id)
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SubsourceConfig {
pub jql_filter: String,
pub badge: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct ListConfig {
pub default_indication: Option<SourceIndication>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SourceIndication {
pub symbol: String,
pub color: String,
pub separator_text: Option<String>,
}
impl Default for SourceIndication {
fn default() -> Self {
Self {
symbol: "•".into(),
color: "default".into(),
separator_text: None,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct HideForADayConfig {
pub duration_hours: Option<u32>,
pub duration_days: Option<u32>,
#[serde(default)]
pub suggested_solutions: Vec<SuggestedSolution>,
}
impl HideForADayConfig {
pub const fn duration_hours(&self) -> u32 {
if let Some(h) = self.duration_hours {
return h;
}
if let Some(d) = self.duration_days {
return d * 24;
}
24
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SuggestedSolution {
pub label: String,
pub link: Option<String>,
pub copy_template: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct CustomViewFieldConfig {
pub field_id: String,
pub name: Option<String>,
pub hint: Option<String>,
pub readonly: Option<bool>,
pub use_editor: Option<bool>,
pub datetime: Option<bool>,
pub duration_role: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct CustomViewSectionConfig {
pub title: String,
pub description: Option<String>,
pub fields: Vec<CustomViewFieldConfig>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct CustomViewConfig {
pub timezone: Option<String>,
pub sections: Vec<CustomViewSectionConfig>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct CacheConfig {
#[serde(default)]
pub enabled: bool,
pub max_age_seconds: Option<u64>,
pub path: Option<String>,
}