apt_cache/apt/
mod.rs

1pub mod parser;
2
3use std::process::Command;
4use std::str;
5
6#[derive(Debug)]
7pub enum AptError {
8    NotFound(String),
9}
10
11/// A generic function for running and parsing apt-cache commands
12pub fn apt_cache(
13    cmd: &str,
14    pkg: &str,
15    parser: &dyn Fn(&str) -> Option<&str>,
16) -> Option<Vec<String>> {
17    let cmd = Command::new("apt-cache")
18        .arg(cmd)
19        .arg(pkg)
20        .output()
21        .expect("Failed to run apt");
22    let output = str::from_utf8(&cmd.stdout);
23    let packages: Vec<String> = output
24        .unwrap()
25        .lines()
26        .filter_map(|pkg| parser(pkg))
27        .map(|s| s.to_string())
28        .collect();
29
30    match packages.len() {
31        0 => None,
32        _ => Some(packages),
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::parser::*;
39    use super::*;
40
41    #[test]
42    fn test_apt_cache() {
43        assert!(apt_cache("search", "bash", &search)
44            .unwrap()
45            .contains(&"bash".to_string()));
46        assert!(apt_cache("search", "does-not-exist", &search).is_none());
47    }
48}