use crate::tasks::*;
use crate::handle::handle::TaskHandle;
use serde::{Deserialize};
use std::sync::{Arc};
const MODULE: &str = "Set";
#[derive(Deserialize,Debug)]
#[serde(deny_unknown_fields)]
pub struct SetTask {
pub name: Option<String>,
pub vars: Option<serde_yaml::Mapping>,
pub with: Option<PreLogicInput>,
pub and: Option<PostLogicInput>,
}
struct SetAction {
pub vars: Option<serde_yaml::Mapping>,
}
impl IsTask for SetTask {
fn get_module(&self) -> String { String::from(MODULE) }
fn get_name(&self) -> Option<String> { self.name.clone() }
fn get_with(&self) -> Option<PreLogicInput> { self.with.clone() }
fn evaluate(&self, handle: &Arc<TaskHandle>, request: &Arc<TaskRequest>, tm: TemplateMode) -> Result<EvaluatedTask, Arc<TaskResponse>> {
return Ok(
EvaluatedTask {
action: Arc::new(SetAction {
vars: self.vars.clone()
}),
with: Arc::new(PreLogicInput::template(&handle, &request, tm, &self.with)?),
and: Arc::new(PostLogicInput::template(&handle, &request, tm, &self.and)?),
}
);
}
}
impl IsAction for SetAction {
fn dispatch(&self, handle: &Arc<TaskHandle>, request: &Arc<TaskRequest>) -> Result<Arc<TaskResponse>, Arc<TaskResponse>> {
match request.request_type {
TaskRequestType::Query => {
return Ok(handle.response.needs_passive(&request));
},
TaskRequestType::Passive => {
let mut mapping = serde_yaml::Mapping::new();
if self.vars.as_ref().is_some() {
for (k,v) in self.vars.as_ref().unwrap().iter() {
if v.is_string() {
let ks = v.as_str().unwrap().to_string();
let vs = v.as_str().unwrap().to_string();
let templated = handle.template.string_unsafe_for_shell(request, TemplateMode::Strict, &ks.clone(), &vs)?;
mapping.insert(k.clone(), serde_yaml::Value::String(templated));
} else {
mapping.insert(k.clone(), v.clone());
}
}
}
handle.host.write().unwrap().update_variables(mapping);
return Ok(handle.response.is_passive(&request));
}
_ => { return Err(handle.response.not_supported(request)); }
}
}
}