chord-flow 0.1.21

async parallel case executor
Documentation
use chrono::Utc;
use log::{info, trace, warn};

use chord_core::case::CaseState;
use chord_core::collection::TailDropVec;
use chord_core::step::StepAsset;
use res::CaseAssetStruct;

use crate::flow::case::arg::CaseArgStruct;
use crate::flow::step::StepRunner;
use crate::model::app::App;

pub mod arg;
pub mod res;

pub async fn run(flow_ctx: &dyn App, mut arg: CaseArgStruct) -> CaseAssetStruct {
    trace!("case run  {}", arg.id());
    let start = Utc::now();
    let mut step_asset_vec = Vec::<Box<dyn StepAsset>>::new();
    let step_vec = arg.step_vec().clone();

    for (step_id, step_runner) in step_vec.iter() {
        let step_runner: &StepRunner = step_runner;

        let mut step_arg = arg.step_arg_create(step_id, flow_ctx);

        let step_asset = step_runner.run(&mut step_arg).await;

        if !step_asset.state().is_ok() {
            step_asset_vec.push(Box::new(step_asset));
            warn!("case Fail {}", arg.id());
            return CaseAssetStruct::new(
                arg.id().clone(),
                start,
                Utc::now(),
                arg.take_data(),
                CaseState::Fail(TailDropVec::from(step_asset_vec)),
            );
        } else {
            arg.step_asset_register(step_asset.id().step(), &step_asset)
                .await;
            step_asset_vec.push(Box::new(step_asset));
        }
    }

    info!("case Ok   {}", arg.id());
    return CaseAssetStruct::new(
        arg.id().clone(),
        start,
        Utc::now(),
        arg.take_data(),
        CaseState::Ok(TailDropVec::from(step_asset_vec)),
    );
}