use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::event::EventType;
fn default_true() -> bool {
true
}
fn default_problem_label() -> String {
"jjj".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GitHubConfig {
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub repo: Option<String>,
#[serde(default)]
pub auto_push: bool,
#[serde(default = "default_true")]
pub sync_critiques: bool,
#[serde(default = "default_true")]
pub sync_lgtm: bool,
#[serde(default)]
pub auto_close_on_solve: bool,
#[serde(default = "default_problem_label")]
pub problem_label: String,
#[serde(default)]
pub label_priority: HashMap<String, String>,
}
impl Default for GitHubConfig {
fn default() -> Self {
Self {
enabled: None,
repo: None,
auto_push: false,
sync_critiques: true,
sync_lgtm: true,
auto_close_on_solve: false,
problem_label: default_problem_label(),
label_priority: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum AutomationAction {
Shell,
GithubPr,
GithubMerge,
GithubClose,
GithubIssue,
GithubSync,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutomationRule {
pub on: EventType,
pub action: AutomationAction,
#[serde(default)]
pub command: Option<String>,
#[serde(default = "default_true")]
pub enabled: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SyncConfig {
#[serde(default)]
pub fetch: Option<String>,
#[serde(default)]
pub push: Option<String>,
#[serde(default)]
pub track: Option<String>,
#[serde(default)]
pub workspace: Option<String>,
}
impl SyncConfig {
pub fn resolve_fetch(&self, has_git: bool) -> Option<String> {
if let Some(ref cmd) = self.fetch {
return Some(cmd.clone());
}
if has_git {
return Some("--ignore-working-copy git fetch --remote {remote}".to_string());
}
None
}
pub fn resolve_push(&self, has_git: bool) -> Option<String> {
if let Some(ref cmd) = self.push {
return Some(cmd.clone());
}
if has_git {
return Some(
"git push -b {bookmark} --remote {remote} --allow-empty-description".to_string(),
);
}
None
}
pub fn resolve_track(&self, has_git: bool) -> Option<String> {
if let Some(ref cmd) = self.track {
return Some(cmd.clone());
}
if has_git {
return Some("bookmark track {bookmark} --remote {remote}".to_string());
}
None
}
pub fn workspace_prefix(&self) -> &str {
self.workspace.as_deref().unwrap_or("workspace")
}
pub fn has_sync(&self, has_git: bool) -> bool {
self.fetch.is_some() || self.push.is_some() || has_git
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ProjectConfig {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub default_reviewers: Vec<String>,
#[serde(default)]
pub settings: HashMap<String, String>,
#[serde(default)]
pub github: GitHubConfig,
#[serde(default)]
pub sync: SyncConfig,
#[serde(default)]
pub automation: Vec<AutomationRule>,
}