hyprshell-config-lib 4.10.0

A library for reading, writing and migrating configuration files for hyprshell
Documentation
use crate::migrate::m2t3;
use serde::Deserialize;
use smart_default::SmartDefault;
use std::fmt::Display;

#[derive(SmartDefault, Debug, Clone, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct Config {
    #[default = true]
    pub(super) layerrules: bool,
    #[default = "ctrl+shift+alt, h"]
    pub(super) kill_bind: String,
    #[default(None)]
    pub(super) windows: Option<Windows>,
    #[allow(dead_code)]
    pub(super) version: u16,
}

#[derive(SmartDefault, Debug, Clone, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct Windows {
    #[default = 8.5]
    pub(super) scale: f64,
    #[default = 5]
    pub(super) items_per_row: u8,
    #[default(None)]
    pub(super) overview: Option<Overview>,
    #[default(None)]
    pub(super) switch: Option<Switch>,
}

#[derive(SmartDefault, Debug, Clone, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct Switch {
    #[default(Modifier::Alt)]
    pub modifier: Modifier,
    #[default(Vec::new())]
    pub filter_by: Vec<crate::io::FilterBy>,
    #[default = false]
    pub show_workspaces: bool,
}

#[derive(SmartDefault, Debug, Clone, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct Overview {
    pub(super) launcher: Launcher,
    #[default = "super_l"]
    pub(super) key: Box<str>,
    #[default(Modifier::Super)]
    pub(super) modifier: Modifier,
    #[default(Vec::new())]
    pub(super) filter_by: Vec<crate::io::FilterBy>,
    #[default = false]
    pub(super) hide_filtered: bool,
    #[allow(dead_code)]
    #[default = true]
    pub(super) strip_html_from_workspace_title: bool,
}

#[derive(SmartDefault, Debug, Clone, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct Launcher {
    #[default(None)]
    pub(super) default_terminal: Option<Box<str>>,
    #[default(Modifier::Ctrl)]
    pub(super) launch_modifier: Modifier,
    #[default = 650]
    pub(super) width: u32,
    #[default = 5]
    pub(super) max_items: u8,
    #[default = true]
    pub(super) show_when_empty: bool,
    #[allow(dead_code)]
    #[default = 400]
    pub(super) animate_launch_ms: u64,
    #[default(m2t3::Plugins{
        applications: Some(crate::io::ApplicationsPluginConfig::default()),
        terminal: Some(crate::io::EmptyConfig::default()),
        shell: None,
        websearch: Some(crate::io::WebSearchConfig::default()),
        calc: Some(crate::io::EmptyConfig::default()),
        path: Some(crate::io::EmptyConfig::default()),
    })]
    pub(super) plugins: m2t3::Plugins,
}

#[derive(Debug, Clone, Copy, Eq, PartialEq, Deserialize)]
#[serde(rename_all = "snake_case")]
pub(super) enum Modifier {
    Alt,
    Ctrl,
    Super,
    Shift,
}

impl Display for Modifier {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Alt => write!(f, "alt"),
            Self::Ctrl => write!(f, "ctrl"),
            Self::Super => write!(f, "super"),
            Self::Shift => write!(f, "shift"),
        }
    }
}