quickterm 0.1.0

A small drop-down terminal for Sway/i3 IPC
Documentation
use std::io::Write;
use std::process::{Command, Stdio};

use crate::error::QuicktermError;

pub fn run_menu(argv: &[String], items: &[String]) -> Result<String, QuicktermError> {
    if argv.is_empty() {
        return Err(QuicktermError::Menu("empty menu command".to_string()));
    }

    let mut child = Command::new(&argv[0])
        .args(&argv[1..])
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .spawn()
        .map_err(|err| QuicktermError::Menu(err.to_string()))?;

    {
        let stdin = child
            .stdin
            .as_mut()
            .ok_or_else(|| QuicktermError::Menu("menu stdin unavailable".to_string()))?;

        for item in items {
            stdin.write_all(item.as_bytes())?;
            stdin.write_all(b"\n")?;
        }
    }

    let output = child
        .wait_with_output()
        .map_err(|err| QuicktermError::Menu(err.to_string()))?;

    Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}