use crate::action::TaskAction;
use crate::env::EnvSettings;
use crate::mutex::Mutex;
use crate::name::TaskName;
use crate::path::{InputSpec, OutputSpec};
use crate::task_ref::TaskRef;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Task {
pub name: TaskName,
pub action: TaskAction,
pub inputs: Vec<InputSpec>,
pub outputs: Vec<OutputSpec>,
pub deps: Vec<TaskRef>,
pub weak_deps: Vec<TaskRef>,
pub mutex: Option<Mutex>,
pub env: EnvSettings,
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use nonempty::NonEmpty;
use crate::action::{ShellType, TaskAction};
use crate::env::EnvSettings;
use crate::mutex::{Mutex, MutexMode, MutexScope};
use crate::name::{MutexName, TaskName};
use crate::path::{InputSpec, OutputSpec};
use crate::task::Task;
use crate::task_ref::TaskRef;
fn name(s: &str) -> TaskName {
TaskName::from_str(s).unwrap()
}
fn argv(parts: &[&str]) -> NonEmpty<String> {
NonEmpty::from_vec(parts.iter().map(|s| (*s).to_owned()).collect()).unwrap()
}
#[test]
fn task_with_command_action() {
let task = Task {
name: name("build"),
action: TaskAction::Command(argv(&["cargo", "build"])),
inputs: vec![InputSpec::parse("src/**/*.rs").unwrap()],
outputs: vec![OutputSpec::parse("target/debug/foo").unwrap()],
deps: vec![],
weak_deps: vec![],
mutex: None,
env: EnvSettings::default(),
};
assert_eq!(task.name.as_ref(), "build");
assert_eq!(task.inputs.len(), 1);
assert_eq!(task.outputs.len(), 1);
assert!(matches!(task.action, TaskAction::Command(_)));
}
#[test]
fn task_with_shell_action_and_mutex() {
let task = Task {
name: name("publish"),
action: TaskAction::Shell {
script: "echo publishing".to_owned(),
shell: ShellType::default(),
},
inputs: vec![],
outputs: vec![],
deps: vec![TaskRef::parse("~:build").unwrap()],
weak_deps: vec![],
mutex: Some(Mutex {
scope: MutexScope::Workspace,
name: MutexName::from_str("registry").unwrap(),
mode: MutexMode::Exclusive,
}),
env: EnvSettings::default(),
};
assert!(matches!(task.action, TaskAction::Shell { .. }));
assert_eq!(task.deps.len(), 1);
assert!(task.mutex.is_some());
}
#[test]
fn task_distinguishes_deps_from_weak_deps_by_field() {
let strong = vec![TaskRef::parse("~:codegen").unwrap()];
let weak = vec![TaskRef::parse("^:lint").unwrap()];
let task = Task {
name: name("compile"),
action: TaskAction::Command(argv(&["cargo", "check"])),
inputs: vec![],
outputs: vec![],
deps: strong.clone(),
weak_deps: weak.clone(),
mutex: None,
env: EnvSettings::default(),
};
assert_eq!(task.deps, strong);
assert_eq!(task.weak_deps, weak);
assert_ne!(task.deps, task.weak_deps);
}
}