use clap::Args;
use serde::Serialize;
use boomack::client::eval::{
EvalParameters,
eval_text_request,
eval_file_request,
eval_stdin_request,
};
use super::{CliConfig, source_auto_content_f, run_request};
#[derive(Args, Serialize)]
pub struct EvalSubCommandArguments {
#[clap(short = 'l', long = "location", alias = "target",
help = "Target panel: E. g. 'my-panel'")]
pub location: Option<String>,
#[clap(help = "Filename or text with JavaScript")]
pub code: Option<String>,
}
impl<'l> EvalSubCommandArguments {
pub fn to_parameters(&'l self) -> EvalParameters<'l> {
EvalParameters {
panel: self.location.as_deref(),
}
}
}
pub fn dispatch_eval_command(cfg: &CliConfig, args: &EvalSubCommandArguments) -> i32 {
let mut text_content: Option<&str> = None;
let mut file_content: Option<&str> = None;
let code = args.code.as_deref();
source_auto_content_f(code, &mut text_content, &mut file_content);
let params = args.to_parameters();
let request = if let Some(text_input) = text_content {
trace!(cfg, "JavaScript from text string");
eval_text_request(params, text_input)
} else if let Some(file_input) = file_content {
trace!(cfg, "JavaScript form file: {}", file_input);
eval_file_request(params, file_input)
} else {
trace!(cfg, "Trying to read JavaScript from STDIN");
eval_stdin_request(params)
};
run_request(cfg, request);
return 0;
}