use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Config {
#[serde(default)]
pub hooks: Hooks,
#[serde(default)]
pub worktree: WorktreeConfig,
#[serde(default, alias = "integration")]
pub integrations: IntegrationsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Hooks {
#[serde(default)]
pub create: HookActions,
#[serde(default)]
pub delete: HookActions,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HookActions {
#[serde(default)]
pub run: Vec<String>,
#[serde(default)]
pub copy: Vec<String>,
#[serde(default)]
pub link: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorktreeConfig {
#[serde(default = "default_dir")]
pub dir: String,
}
impl Default for WorktreeConfig {
fn default() -> Self {
Self { dir: default_dir() }
}
}
fn default_dir() -> String {
"../{repo}-worktrees/{branch}".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IntegrationsConfig {
#[serde(default)]
pub zoxide: ZoxideConfig,
#[serde(default)]
pub fzf: FzfConfig,
#[serde(default)]
pub tmux: TmuxConfig,
#[serde(default)]
pub gh: GhConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZoxideConfig {
#[serde(default = "default_zoxide_enabled")]
pub enabled: bool,
}
impl Default for ZoxideConfig {
fn default() -> Self {
Self { enabled: true }
}
}
const fn default_zoxide_enabled() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FzfConfig {
#[serde(default = "default_fzf_enabled")]
pub enabled: bool,
#[serde(default)]
pub options: Vec<String>,
}
impl Default for FzfConfig {
fn default() -> Self {
Self {
enabled: true,
options: Vec::new(),
}
}
}
const fn default_fzf_enabled() -> bool {
true
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum TmuxBehavior {
#[default]
Auto,
Always,
Never,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TmuxConfig {
#[serde(default)]
pub behavior: TmuxBehavior,
#[serde(default = "default_tmux_create")]
pub create: String,
}
impl Default for TmuxConfig {
fn default() -> Self {
Self {
behavior: TmuxBehavior::default(),
create: default_tmux_create(),
}
}
}
fn default_tmux_create() -> String {
"window".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GhConfig {
#[serde(default = "default_gh_enabled")]
pub enabled: bool,
}
impl Default for GhConfig {
fn default() -> Self {
Self { enabled: true }
}
}
const fn default_gh_enabled() -> bool {
true
}
impl Hooks {
#[allow(dead_code)]
pub(super) fn merge(&self, other: &Self) -> Self {
Self {
create: self.create.merge(&other.create),
delete: self.delete.merge(&other.delete),
}
}
}
impl HookActions {
#[allow(dead_code)]
pub(super) fn merge(&self, other: &Self) -> Self {
let mut run = self.run.clone();
run.extend(other.run.clone());
let mut copy = self.copy.clone();
copy.extend(other.copy.clone());
let mut link = self.link.clone();
link.extend(other.link.clone());
Self { run, copy, link }
}
}