use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::git::HookType;
use super::commands::CommandConfig;
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, JsonSchema)]
pub struct HooksConfig {
#[serde(
default,
rename = "pre-switch",
skip_serializing_if = "Option::is_none"
)]
pub pre_switch: Option<CommandConfig>,
#[serde(
default,
rename = "post-switch",
skip_serializing_if = "Option::is_none"
)]
pub post_switch: Option<CommandConfig>,
#[serde(default, rename = "pre-start", skip_serializing_if = "Option::is_none")]
pub pre_start: Option<CommandConfig>,
#[serde(
default,
rename = "post-create",
skip_serializing_if = "Option::is_none"
)]
pub post_create: Option<CommandConfig>,
#[serde(
default,
rename = "post-start",
skip_serializing_if = "Option::is_none"
)]
pub post_start: Option<CommandConfig>,
#[serde(
default,
rename = "pre-commit",
skip_serializing_if = "Option::is_none"
)]
pub pre_commit: Option<CommandConfig>,
#[serde(
default,
rename = "post-commit",
skip_serializing_if = "Option::is_none"
)]
pub post_commit: Option<CommandConfig>,
#[serde(default, rename = "pre-merge", skip_serializing_if = "Option::is_none")]
pub pre_merge: Option<CommandConfig>,
#[serde(
default,
rename = "post-merge",
skip_serializing_if = "Option::is_none"
)]
pub post_merge: Option<CommandConfig>,
#[serde(
default,
rename = "pre-remove",
skip_serializing_if = "Option::is_none"
)]
pub pre_remove: Option<CommandConfig>,
#[serde(
default,
rename = "post-remove",
skip_serializing_if = "Option::is_none"
)]
pub post_remove: Option<CommandConfig>,
}
impl HooksConfig {
pub fn get(&self, hook: HookType) -> Option<&CommandConfig> {
match hook {
HookType::PreSwitch => self.pre_switch.as_ref(),
HookType::PostSwitch => self.post_switch.as_ref(),
HookType::PreStart => self.pre_start.as_ref().or(self.post_create.as_ref()),
HookType::PostStart => self.post_start.as_ref(),
HookType::PreCommit => self.pre_commit.as_ref(),
HookType::PostCommit => self.post_commit.as_ref(),
HookType::PreMerge => self.pre_merge.as_ref(),
HookType::PostMerge => self.post_merge.as_ref(),
HookType::PreRemove => self.pre_remove.as_ref(),
HookType::PostRemove => self.post_remove.as_ref(),
}
}
}
use super::user::Merge;
fn merge_append_hooks(
base: &Option<CommandConfig>,
overlay: &Option<CommandConfig>,
) -> Option<CommandConfig> {
match (base, overlay) {
(None, None) => None,
(Some(b), None) => Some(b.clone()),
(None, Some(o)) => Some(o.clone()),
(Some(b), Some(o)) => Some(b.merge_append(o)),
}
}
impl Merge for HooksConfig {
fn merge_with(&self, other: &Self) -> Self {
let self_pre_start = merge_append_hooks(&self.pre_start, &self.post_create);
let other_pre_start = merge_append_hooks(&other.pre_start, &other.post_create);
Self {
pre_switch: merge_append_hooks(&self.pre_switch, &other.pre_switch),
post_switch: merge_append_hooks(&self.post_switch, &other.post_switch),
pre_start: merge_append_hooks(&self_pre_start, &other_pre_start),
post_create: None, post_start: merge_append_hooks(&self.post_start, &other.post_start),
pre_commit: merge_append_hooks(&self.pre_commit, &other.pre_commit),
post_commit: merge_append_hooks(&self.post_commit, &other.post_commit),
pre_merge: merge_append_hooks(&self.pre_merge, &other.pre_merge),
post_merge: merge_append_hooks(&self.post_merge, &other.post_merge),
pre_remove: merge_append_hooks(&self.pre_remove, &other.pre_remove),
post_remove: merge_append_hooks(&self.post_remove, &other.post_remove),
}
}
}