obs-hotkey 1.0.18

Lightweight daemon for controlling OBS Studio with global hotkeys on Wayland and X11
use crate::ansi::*;
use crate::config::AppConfig;

pub struct HotkeyBinding {
    pub key_name: String,
    pub action: &'static str,
    pub label: &'static str,
}

pub fn print_banner(_cfg: &AppConfig, bindings: &[HotkeyBinding], autostart: bool) {
    println!();
    println!("  {}", heading("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"));
    println!("  {}  OBS Hotkey Controller{}", BOLD, RESET);
    println!("  {}  Wayland-compatible{}", DIM, RESET);
    println!("  {}", heading("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"));
    println!();

    for b in bindings {
        if b.key_name.is_empty() {
            continue;
        }
        if crate::input::get_key_code(&b.key_name).is_none() {
            continue;
        }
        println!("  {}{}", key(&b.key_name), b.label);
    }
    println!();

    if autostart {
        println!("  {} Auto-start enabled", ok(""));
    } else {
        println!("  {} Auto-start not configured", warn(""));
        println!("     {} to enable", key("obs-hotkey setup"));
    }
    println!();

    if !running_under_systemd() {
        println!("  {} Listening for hotkeys... (Ctrl+C to exit){}", DIM, RESET);
    }
}

fn running_under_systemd() -> bool {
    std::env::var("INVOCATION_ID").is_ok() || std::env::var("JOURNAL_STREAM").is_ok()
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::config::default_config;

    #[test]
    fn test_print_banner_runs_without_panic() {
        let cfg = default_config();
        let bindings = vec![
            HotkeyBinding {
                key_name: "scroll lock".to_string(),
                action: "toggle_recording",
                label: "Toggle Recording",
            },
            HotkeyBinding {
                key_name: "".to_string(),
                action: "toggle_pause",
                label: "Toggle Pause/Resume",
            },
        ];
        print_banner(&cfg, &bindings, false);
    }

    #[test]
    fn test_running_under_systemd() {
        std::env::remove_var("INVOCATION_ID");
        std::env::remove_var("JOURNAL_STREAM");
        let result = running_under_systemd();
        assert!(!result, "should return false when not running under systemd");
    }
}