#![allow(unused)]
use crate::common::model::entity::{AccountModel, PlatformModel};
use crate::common::model::{Request, login_info::LoginInfo};
use crate::engine::task::module::Module;
use crate::errors::Result;
use futures::StreamExt;
use uuid::Uuid;
#[derive(Clone)]
pub struct Task {
pub account: AccountModel,
pub platform: PlatformModel,
pub login_info: Option<LoginInfo>,
pub modules: Vec<Module>,
pub metadata: serde_json::Map<String, serde_json::Value>,
pub run_id: Uuid,
pub prefix_request: Uuid,
}
impl Task {
pub fn id(&self) -> String {
format!("{}-{}", self.account.name, self.platform.name)
}
pub fn get_module_names(&self) -> Vec<String> {
self.modules.iter().map(|module| module.id()).collect()
}
pub async fn build_requests(&self) -> Result<Vec<Request>> {
use futures::future::join_all;
let futures = self
.modules
.iter()
.map(|module| module.generate(self.metadata.clone(), self.login_info.clone()));
let results = join_all(futures).await;
let mut all_requests = Vec::new();
for result in results {
match result {
Ok(stream) => {
let mut reqs: Vec<Request> = stream.collect().await;
all_requests.append(&mut reqs);
}
Err(e) => return Err(e),
}
}
Ok(all_requests)
}
pub fn is_empty(&self) -> bool {
self.modules.is_empty()
}
}