halley-config 0.1.0

Configuration loading and parsing for the Halley Wayland compositor.
Documentation
use rune_cfg::RuneConfig;

use crate::layout::RuntimeTuning;

use super::super::primitives::{pick_bool, pick_decoration_border_color, pick_i32};

pub(crate) fn load_decorations_section(cfg: &RuneConfig, out: &mut RuntimeTuning) {
    out.decorations.border.size_px = pick_i32(
        cfg,
        &["decorations.border.size"],
        out.decorations.border.size_px,
    );
    out.decorations.border.radius_px = pick_i32(
        cfg,
        &["decorations.border.radius"],
        out.decorations.border.radius_px,
    );
    out.decorations.border.color_focused = pick_decoration_border_color(
        cfg,
        &[
            "decorations.border.colour-focused",
            "decorations.border.colour_focused",
            "decorations.border.color-focused",
            "decorations.border.color_focused",
        ],
        out.decorations.border.color_focused,
    );
    out.decorations.border.color_unfocused = pick_decoration_border_color(
        cfg,
        &[
            "decorations.border.colour-unfocused",
            "decorations.border.colour_unfocused",
            "decorations.border.color-unfocused",
            "decorations.border.color_unfocused",
        ],
        out.decorations.border.color_unfocused,
    );

    out.decorations.secondary_border.enabled = pick_bool(
        cfg,
        &["decorations.secondary-border.enabled"],
        out.decorations.secondary_border.enabled,
    );
    out.decorations.secondary_border.size_px = pick_i32(
        cfg,
        &["decorations.secondary-border.size"],
        out.decorations.secondary_border.size_px,
    );
    out.decorations.secondary_border.gap_px = pick_i32(
        cfg,
        &["decorations.secondary-border.gap"],
        out.decorations.secondary_border.gap_px,
    );
    out.decorations.secondary_border.color_focused = pick_decoration_border_color(
        cfg,
        &[
            "decorations.secondary-border.colour-focused",
            "decorations.secondary-border.colour_focused",
            "decorations.secondary-border.color-focused",
            "decorations.secondary-border.color_focused",
        ],
        out.decorations.secondary_border.color_focused,
    );
    out.decorations.secondary_border.color_unfocused = pick_decoration_border_color(
        cfg,
        &[
            "decorations.secondary-border.colour-unfocused",
            "decorations.secondary-border.colour_unfocused",
            "decorations.secondary-border.color-unfocused",
            "decorations.secondary-border.color_unfocused",
        ],
        out.decorations.secondary_border.color_unfocused,
    );

    out.decorations.resize_using_border = pick_bool(
        cfg,
        &["decorations.resize-using-border"],
        out.decorations.resize_using_border,
    );
}

#[cfg(test)]
mod tests {
    use rune_cfg::RuneConfig;

    use crate::layout::RuntimeTuning;

    use super::load_decorations_section;

    #[test]
    fn decorations_section_parses_nested_border_config() {
        let cfg = RuneConfig::from_str(
            r##"
decorations:
  border:
    size 4
    radius 7
    colour-focused "#d65d26"
    color-unfocused "#333333"
  end

  secondary-border:
    enabled true
    size 2
    gap 3
    colour-focused "#fabd2f"
    color-unfocused "#1f1f1f"
  end

  resize-using-border true
end
"##,
        )
        .expect("decorations config should parse");

        let mut out = RuntimeTuning::default();
        load_decorations_section(&cfg, &mut out);

        assert_eq!(out.decorations.border.size_px, 4);
        assert_eq!(out.decorations.border.radius_px, 7);
        assert_eq!(out.decorations.secondary_border.enabled, true);
        assert_eq!(out.decorations.secondary_border.size_px, 2);
        assert_eq!(out.decorations.secondary_border.gap_px, 3);
        assert!(out.decorations.resize_using_border);
    }

    #[test]
    fn decoration_defaults_match_runtime_defaults() {
        let out = RuntimeTuning::default();
        assert_eq!(out.decorations.border.size_px, 3);
        assert_eq!(out.decorations.border.radius_px, 0);
        assert!(!out.decorations.secondary_border.enabled);
        assert_eq!(out.decorations.secondary_border.size_px, 1);
        assert_eq!(out.decorations.secondary_border.gap_px, 2);
        assert!(!out.decorations.resize_using_border);
    }
}