1pub mod parser;
2
3use std::process::Command;
4use std::str;
5
6#[derive(Debug)]
7pub enum AptError {
8 NotFound(String),
9}
10
11pub 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}