use anyhow::Result; use clap::Parser; use std::{ fs::File, io::{BufRead, BufReader}, }; /// Print information about an existing message queue #[derive(Debug, Parser)] pub struct Info { /// Id of the queue #[clap(short, long, required_unless_present_any = &["key"], conflicts_with = "key")] id: Option, /// Key of the queue #[clap(short, long, required_unless_present_any = &["id"], conflicts_with = "id")] key: Option, } fn print_line(line: &str) { for field in line.split_whitespace().collect::>() { print!("{0: <10}", field); } println!(); } impl Info { pub fn run(&self) -> Result<()> { let mut lines = BufReader::new(File::open("/proc/sysvipc/msg")?).lines(); print_line(&lines.next().unwrap_or_else(|| Ok(String::new()))?); for line in lines { let line = line?; if let Some(id) = self.id { if id == line.split_whitespace().collect::>()[1].parse::()? { print_line(&line); break; } } else if let Some(key) = self.key { if key == line.split_whitespace().collect::>()[0].parse::()? { print_line(&line); break; } } } Ok(()) } }