free-launch 0.2.9

A simple fuzzy launcher written in Rust.
Documentation
use std::path::Path;

/// Convert [`egui`] keys to their [`keybinds`] equivalent
pub(crate) fn egui_to_keybinds_key(key: &egui::Key) -> keybinds::Key {
    match key {
        egui::Key::ArrowDown => keybinds::Key::Down,
        egui::Key::ArrowLeft => keybinds::Key::Left,
        egui::Key::ArrowRight => keybinds::Key::Right,
        egui::Key::ArrowUp => keybinds::Key::Up,
        egui::Key::Escape => keybinds::Key::Esc,
        egui::Key::Tab => keybinds::Key::Tab,
        egui::Key::Backspace => keybinds::Key::Backspace,
        egui::Key::Enter => keybinds::Key::Enter,
        egui::Key::Space => keybinds::Key::Char(' '),
        egui::Key::Insert => keybinds::Key::Insert,
        egui::Key::Delete => keybinds::Key::Delete,
        egui::Key::Home => keybinds::Key::Home,
        egui::Key::End => keybinds::Key::End,
        egui::Key::PageUp => keybinds::Key::PageUp,
        egui::Key::PageDown => keybinds::Key::PageDown,
        egui::Key::Copy => keybinds::Key::Copy,
        egui::Key::Cut => keybinds::Key::Cut,
        egui::Key::Paste => keybinds::Key::Paste,
        egui::Key::Colon => keybinds::Key::Char(':'),
        egui::Key::Comma => keybinds::Key::Char(','),
        egui::Key::Backslash => keybinds::Key::Char('\\'),
        egui::Key::Slash => keybinds::Key::Char('/'),
        egui::Key::Pipe => keybinds::Key::Char('|'),
        egui::Key::Questionmark => keybinds::Key::Char('?'),
        egui::Key::Exclamationmark => keybinds::Key::Char('!'),
        egui::Key::OpenBracket => keybinds::Key::Char('['),
        egui::Key::CloseBracket => keybinds::Key::Char(']'),
        egui::Key::OpenCurlyBracket => keybinds::Key::Char('{'),
        egui::Key::CloseCurlyBracket => keybinds::Key::Char('}'),
        egui::Key::Backtick => keybinds::Key::Char('`'),
        egui::Key::Minus => keybinds::Key::Char('-'),
        egui::Key::Period => keybinds::Key::Char('.'),
        egui::Key::Plus => keybinds::Key::Char('+'),
        egui::Key::Equals => keybinds::Key::Char('='),
        egui::Key::Semicolon => keybinds::Key::Char(';'),
        egui::Key::Quote => keybinds::Key::Char('\''),
        egui::Key::Num0 => keybinds::Key::Char('0'),
        egui::Key::Num1 => keybinds::Key::Char('1'),
        egui::Key::Num2 => keybinds::Key::Char('2'),
        egui::Key::Num3 => keybinds::Key::Char('3'),
        egui::Key::Num4 => keybinds::Key::Char('4'),
        egui::Key::Num5 => keybinds::Key::Char('5'),
        egui::Key::Num6 => keybinds::Key::Char('6'),
        egui::Key::Num7 => keybinds::Key::Char('7'),
        egui::Key::Num8 => keybinds::Key::Char('8'),
        egui::Key::Num9 => keybinds::Key::Char('9'),
        egui::Key::A => keybinds::Key::Char('a'),
        egui::Key::B => keybinds::Key::Char('b'),
        egui::Key::C => keybinds::Key::Char('c'),
        egui::Key::D => keybinds::Key::Char('d'),
        egui::Key::E => keybinds::Key::Char('e'),
        egui::Key::F => keybinds::Key::Char('f'),
        egui::Key::G => keybinds::Key::Char('g'),
        egui::Key::H => keybinds::Key::Char('h'),
        egui::Key::I => keybinds::Key::Char('i'),
        egui::Key::J => keybinds::Key::Char('j'),
        egui::Key::K => keybinds::Key::Char('k'),
        egui::Key::L => keybinds::Key::Char('l'),
        egui::Key::M => keybinds::Key::Char('m'),
        egui::Key::N => keybinds::Key::Char('n'),
        egui::Key::O => keybinds::Key::Char('o'),
        egui::Key::P => keybinds::Key::Char('p'),
        egui::Key::Q => keybinds::Key::Char('q'),
        egui::Key::R => keybinds::Key::Char('r'),
        egui::Key::S => keybinds::Key::Char('s'),
        egui::Key::T => keybinds::Key::Char('t'),
        egui::Key::U => keybinds::Key::Char('u'),
        egui::Key::V => keybinds::Key::Char('v'),
        egui::Key::W => keybinds::Key::Char('w'),
        egui::Key::X => keybinds::Key::Char('x'),
        egui::Key::Y => keybinds::Key::Char('y'),
        egui::Key::Z => keybinds::Key::Char('z'),
        egui::Key::F1 => keybinds::Key::F1,
        egui::Key::F2 => keybinds::Key::F2,
        egui::Key::F3 => keybinds::Key::F3,
        egui::Key::F4 => keybinds::Key::F4,
        egui::Key::F5 => keybinds::Key::F5,
        egui::Key::F6 => keybinds::Key::F6,
        egui::Key::F7 => keybinds::Key::F7,
        egui::Key::F8 => keybinds::Key::F8,
        egui::Key::F9 => keybinds::Key::F9,
        egui::Key::F10 => keybinds::Key::F10,
        egui::Key::F11 => keybinds::Key::F11,
        egui::Key::F12 => keybinds::Key::F12,
        egui::Key::F13 => keybinds::Key::F13,
        egui::Key::F14 => keybinds::Key::F14,
        egui::Key::F15 => keybinds::Key::F15,
        egui::Key::F16 => keybinds::Key::F16,
        egui::Key::F17 => keybinds::Key::F17,
        egui::Key::F18 => keybinds::Key::F18,
        egui::Key::F19 => keybinds::Key::F19,
        egui::Key::F20 => keybinds::Key::F20,
        egui::Key::F21 => keybinds::Key::F21,
        egui::Key::F22 => keybinds::Key::F22,
        egui::Key::F23 => keybinds::Key::F23,
        egui::Key::F24 => keybinds::Key::F24,
        egui::Key::F25 => keybinds::Key::F25,
        egui::Key::F26 => keybinds::Key::F26,
        egui::Key::F27 => keybinds::Key::F27,
        egui::Key::F28 => keybinds::Key::F28,
        egui::Key::F29 => keybinds::Key::F29,
        egui::Key::F30 => keybinds::Key::F30,
        egui::Key::F31 => keybinds::Key::F31,
        egui::Key::F32 => keybinds::Key::F32,
        egui::Key::F33 => keybinds::Key::F33,
        egui::Key::F34 => keybinds::Key::F34,
        egui::Key::F35 => keybinds::Key::F35,
        egui::Key::BrowserBack => keybinds::Key::Ignored,
    }
}

/// Reveal a file in the system file manager using the freedesktop FileManager1 D-Bus interface.
///
/// This is equivalent to running:
/// ```bash
/// gdbus call --session --dest org.freedesktop.FileManager1 \
///     --object-path /org/freedesktop/FileManager1 \
///     --method org.freedesktop.FileManager1.ShowItems \
///     "['file:///path/to/file']" ""
/// ```
///
/// # Arguments
/// * `path` - The path to the file to reveal in the file manager
///
/// # Returns
/// * `Ok(())` if the file was successfully revealed
/// * `Err` if there was an error connecting to D-Bus or calling the method
pub fn reveal(path: &Path) -> Result<(), Box<dyn std::error::Error>> {
    // Canonicalize the path to get the absolute path
    let canonical_path = path.canonicalize()?;

    // Convert to a file:// URI
    let file_uri = format!("file://{}", canonical_path.display());

    // Use zbus to call the D-Bus method
    let connection = zbus::blocking::Connection::session()?;

    let proxy = zbus::blocking::Proxy::new(
        &connection,
        "org.freedesktop.FileManager1",
        "/org/freedesktop/FileManager1",
        "org.freedesktop.FileManager1",
    )?;

    // Call ShowItems with an array containing our file URI and an empty startup_id
    // The method signature is (as, s) - array of strings, string
    let uris: Vec<&str> = vec![file_uri.as_str()];
    let startup_id: &str = "";
    proxy.call_method("ShowItems", &(uris, startup_id))?;

    Ok(())
}