moonlight-cli 0.1.0

Compare command behavior against one or two reference commands.
Documentation
use crate::{
    args::RunArgs,
    config::build_compare_config,
    execute::execute_case,
    types::{Case, PreparedCase, TargetCommand},
};
use moonlight_core::storage::RunWriter;
use std::sync::Arc;

pub(crate) async fn run(args: RunArgs) -> anyhow::Result<()> {
    let case = Case {
        primary: TargetCommand::Shell(args.primary),
        candidate: TargetCommand::Shell(args.candidate),
        secondary: args.secondary.map(TargetCommand::Shell),
        max_body_capture_bytes: args.max_body_capture_bytes,
        ignored_json_paths: args.ignored_json_paths,
        ignored_headers: args.ignored_headers,
        ignore_stderr: args.ignore_stderr,
    };
    let compare_config = Arc::new(build_compare_config(
        &case.ignored_json_paths,
        &case.ignored_headers,
        case.ignore_stderr,
    ));
    let run = execute_case(
        PreparedCase {
            case,
            compare_config,
        },
        args.serial_targets,
    )
    .await;

    let writer = RunWriter::open(args.storage.storage_path).await?;
    writer.append(&run).await?;
    writer.flush().await?;

    if !args.quiet {
        if args.compact {
            println!("{}", serde_json::to_string(&run)?);
        } else {
            println!("{}", serde_json::to_string_pretty(&run)?);
        }
    }
    Ok(())
}