1
use schemars::JsonSchema;
2
use serde::Deserialize;
3

            
4
use crate::defaults::{
5
  default_ignore_errors,
6
  default_verbose,
7
};
8
use crate::schema::{
9
  run_task_by_name,
10
  TaskContext,
11
};
12

            
13
#[derive(Debug, Deserialize, Clone, JsonSchema)]
14
pub struct TaskRun {
15
  /// The name of the task to run
16
  pub task: String,
17

            
18
  /// Ignore errors if the task commands fail
19
  #[serde(default)]
20
  pub ignore_errors: Option<bool>,
21

            
22
  /// Show verbose output
23
  #[serde(default)]
24
  pub verbose: Option<bool>,
25
}
26

            
27
impl TaskRun {
28
  pub fn execute(&self, context: &TaskContext) -> anyhow::Result<()> {
29
    assert!(!self.task.is_empty());
30

            
31
    let ignore_errors = self.ignore_errors(context);
32
    let verbose = self.verbose(context);
33

            
34
    let context = TaskContext::from_context_with_args(context, ignore_errors, verbose);
35
    run_task_by_name(&context, &self.task)
36
  }
37

            
38
  fn ignore_errors(&self, context: &TaskContext) -> bool {
39
    self
40
      .ignore_errors
41
      .or(context.ignore_errors)
42
      .unwrap_or(default_ignore_errors())
43
  }
44

            
45
  fn verbose(&self, context: &TaskContext) -> bool {
46
    self.verbose.or(context.verbose).unwrap_or(default_verbose())
47
  }
48
}