gitignore-in 0.2.1

A command line tool for managing .gitignore files with gitignore.in
pub fn gibo_command(target: &str) -> std::io::Result<String> {
    let output = std::process::Command::new("gibo")
        .arg("dump")
        .arg(target)
        .output()?;

    let stdout = match String::from_utf8(output.stdout) {
        Ok(it) => it,
        Err(err) => return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, err)),
    };
    let stderr = match String::from_utf8(output.stderr) {
        Ok(it) => it,
        Err(err) => return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, err)),
    };
    if stderr.contains("boilerplate not found") {
        return Err(std::io::Error::other(format!(
            "Failed to get {target} from gibo: {stdout}"
        )));
    }
    Ok(stdout)
}

pub fn gibo_list() -> std::io::Result<Vec<String>> {
    let output = std::process::Command::new("gibo").arg("list").output()?;
    let stdout = match String::from_utf8(output.stdout) {
        Ok(it) => it,
        Err(err) => return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, err)),
    };
    Ok(stdout
        .lines()
        .map(str::trim)
        .filter(|line| !line.is_empty())
        .map(ToString::to_string)
        .collect())
}

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

    #[test]
    fn test_gibo_command() {
        let result = gibo_command("C++");
        let result = match result {
            Ok(result) => result,
            Err(e) => {
                println!("{e}");
                unreachable!();
            }
        };
        assert!(result.contains("Generated by gibo"));
        assert!(result.contains("C++"));
    }

    #[test]
    fn test_gibo_command_fail() {
        let result = gibo_command("unknown-language");
        assert!(result.is_err());
    }
}