use std::sync::Arc;
use crate::tasks::fields::Field;
use std::vec::Vec;
#[derive(Debug,PartialEq)]
pub enum TaskRequestType {
Validate,
Query,
Create,
Remove,
Modify,
Execute,
Passive,
}
#[derive(Debug)]
pub struct TaskRequest {
pub request_type: TaskRequestType,
pub changes: Vec<Field>,
pub sudo_details: Option<SudoDetails>
}
#[derive(Debug,PartialEq,Clone)]
pub struct SudoDetails {
pub user: Option<String>,
pub template: String
}
impl TaskRequest {
pub fn validate() -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Validate,
changes: Vec::new(),
sudo_details: None
}
)
}
pub fn query(sudo_details: &SudoDetails) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Query,
changes: Vec::new(),
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn create(sudo_details: &SudoDetails) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Create,
changes: Vec::new(),
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn remove(sudo_details: &SudoDetails) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Remove,
changes: Vec::new(),
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn modify(sudo_details: &SudoDetails, changes: Vec<Field>) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Modify,
changes: changes,
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn execute(sudo_details: &SudoDetails) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Execute,
changes: Vec::new(),
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn passive(sudo_details: &SudoDetails) -> Arc<Self> {
return Arc::new(
Self {
request_type: TaskRequestType::Passive,
changes: Vec::new(),
sudo_details: Some(sudo_details.clone())
}
)
}
pub fn is_sudoing(&self) -> bool {
let sudo_details = &self.sudo_details;
if sudo_details.is_none() || sudo_details.as_ref().unwrap().user.is_none() {
return false
}
return true;
}
}