|
|
|
use serde_json::{from_slice, Value};
|
|
|
|
use shlex::split;
|
|
|
|
use std::process::{Command, Output};
|
|
|
|
|
|
|
|
const PANEL_BINARY: &str = "/u_panel";
|
|
|
|
|
|
|
|
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]) -> Value {
|
|
|
|
let result = Self::run(args);
|
|
|
|
assert!(result.status.success());
|
|
|
|
from_slice(&result.stdout).unwrap()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn output<S: Into<String>>(args: S) -> Value {
|
|
|
|
let splitted = split(args.into().as_ref()).unwrap();
|
|
|
|
Self::output_argv(
|
|
|
|
splitted
|
|
|
|
.iter()
|
|
|
|
.map(|s| s.as_ref())
|
|
|
|
.collect::<Vec<&str>>()
|
|
|
|
.as_ref(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn status_is_ok(data: &Value) {
|
|
|
|
assert_eq!(
|
|
|
|
data["status"], "ok",
|
|
|
|
"Panel failed with erroneous status: {}",
|
|
|
|
data["data"]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn check_status<S: Into<String>>(args: S) {
|
|
|
|
let result = Self::output(args);
|
|
|
|
Self::status_is_ok(&result);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn check_output<S: Into<String>>(args: S) -> Vec<Value> {
|
|
|
|
let result = Self::output(args);
|
|
|
|
Self::status_is_ok(&result);
|
|
|
|
result["data"].as_array().unwrap().clone()
|
|
|
|
}
|
|
|
|
}
|