use serde::de::DeserializeOwned; use serde_json::from_slice; use shlex::split; use std::process::{Command, Output}; use u_lib::{datatypes::DataResult, messaging::AsMsg}; 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(args: &[&str]) -> PanelResult { let result = Self::run(args); assert!(result.status.success()); from_slice(&result.stdout).map_err(|e| 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 with erroneous status: {}", e), } } pub fn check_status<'s, T: AsMsg + DeserializeOwned>(args: &'s str) { 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) } }