halley-config 0.3.1

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_overlay_border_source, pick_overlay_color_mode, pick_overlay_shape,
};

pub(crate) fn load_overlays_section(cfg: &RuneConfig, out: &mut RuntimeTuning) {
    out.overlay_style.background_color = pick_overlay_color_mode(
        cfg,
        &[
            "overlay.background-colour",
            "overlay.background_colour",
            "overlay.background-color",
            "overlay.background_color",
            "overlays.background-colour",
            "overlays.background_colour",
            "overlays.background-color",
            "overlays.background_color",
        ],
        out.overlay_style.background_color,
    );
    out.overlay_style.text_color = pick_overlay_color_mode(
        cfg,
        &[
            "overlay.text-colour",
            "overlay.text_colour",
            "overlay.text-color",
            "overlay.text_color",
            "overlays.text-colour",
            "overlays.text_colour",
            "overlays.text-color",
            "overlays.text_color",
        ],
        out.overlay_style.text_color,
    );
    out.overlay_style.error_color = pick_overlay_color_mode(
        cfg,
        &[
            "overlay.error-colour",
            "overlay.error_colour",
            "overlay.error-color",
            "overlay.error_color",
            "overlays.error-colour",
            "overlays.error_colour",
            "overlays.error-color",
            "overlays.error_color",
        ],
        out.overlay_style.error_color,
    );
    out.overlay_style.shape = pick_overlay_shape(
        cfg,
        &["overlay.shape", "overlays.shape"],
        out.overlay_style.shape,
    );
    out.overlay_style.borders = pick_bool(
        cfg,
        &["overlay.borders", "overlays.borders"],
        out.overlay_style.borders,
    );
    out.overlay_style.border_source = pick_overlay_border_source(
        cfg,
        &[
            "overlay.border-source",
            "overlay.border_source",
            "overlays.border-source",
            "overlays.border_source",
        ],
        out.overlay_style.border_source,
    );
}

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

    use crate::layout::{OverlayBorderSource, OverlayColorMode, OverlayShape, RuntimeTuning};

    use super::load_overlays_section;

    #[test]
    fn overlays_section_parses_palette_shape_and_borders() {
        let cfg = RuneConfig::from_str(
            r##"
overlays:
  background-colour "#223344"
  text-colour "dark"
  error-colour "#fb4934"
  shape "rounded"
  borders false
  border-source "secondary"
end
"##,
        )
        .expect("overlay config should parse");

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

        assert_eq!(
            out.overlay_style.background_color,
            OverlayColorMode::Fixed {
                r: 0x22 as f32 / 255.0,
                g: 0x33 as f32 / 255.0,
                b: 0x44 as f32 / 255.0,
            }
        );
        assert_eq!(out.overlay_style.text_color, OverlayColorMode::Dark);
        assert_eq!(
            out.overlay_style.error_color,
            OverlayColorMode::Fixed {
                r: 0xfb as f32 / 255.0,
                g: 0x49 as f32 / 255.0,
                b: 0x34 as f32 / 255.0,
            }
        );
        assert_eq!(out.overlay_style.shape, OverlayShape::Rounded);
        assert!(!out.overlay_style.borders);
        assert_eq!(
            out.overlay_style.border_source,
            OverlayBorderSource::Secondary
        );
    }

    #[test]
    fn overlay_defaults_enable_square_bordered_auto_palette() {
        let defaults = RuntimeTuning::default();
        assert_eq!(
            defaults.overlay_style.background_color,
            OverlayColorMode::Auto
        );
        assert_eq!(defaults.overlay_style.text_color, OverlayColorMode::Auto);
        assert_eq!(
            defaults.overlay_style.error_color,
            OverlayColorMode::Fixed {
                r: 0xfb as f32 / 255.0,
                g: 0x49 as f32 / 255.0,
                b: 0x34 as f32 / 255.0,
            }
        );
        assert_eq!(defaults.overlay_style.shape, OverlayShape::Square);
        assert!(defaults.overlay_style.borders);
        assert_eq!(
            defaults.overlay_style.border_source,
            OverlayBorderSource::Primary
        );
    }
}