boomack-cli 0.2.1

CLI client for Boomack
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;
}