use serde::de::DeserializeOwned; use serde_json::{from_slice, Value}; use shlex::split; use std::process::{Command, Output}; use u_lib::{datatypes::DataResult, utils::VecDisplay}; const PANEL_BINARY: &str = "/u_panel"; type PanelResult = Result, String>; pub struct Panel; impl Panel { fn run(args: &[&str]) -> Output { Command::new(PANEL_BINARY) .arg("--json") .args(args) .output() .unwrap() } pub fn output_argv(argv: &[&str]) -> PanelResult { let result = Self::run(argv); from_slice(&result.stdout).map_err(|e| { eprintln!( "Failed to decode panel response: '{}'", VecDisplay(result.stdout) ); e.to_string() }) } pub fn output(args: impl Into) -> PanelResult { let splitted = split(args.into().as_ref()).unwrap(); Self::output_argv( splitted .iter() .map(|s| s.as_ref()) .collect::>() .as_ref(), ) } fn status_is_ok(data: PanelResult) -> T { match data.unwrap() { DataResult::Ok(r) => r, DataResult::Err(e) => panic!("Panel failed: {}", e), } } pub fn check_status(args: impl Into) { let result: PanelResult = Self::output(args); Self::status_is_ok(result); } pub fn check_output(args: impl Into) -> T { let result = Self::output(args); Self::status_is_ok(result) } }