Skip to main content

task_commander/
errors.rs

1//! # Definition of result and errors
2
3use antex::{ColorMode, StyledText, Text};
4
5/// Common result type.
6pub type Result<T, E = TaskCommanderError> = std::result::Result<T, E>;
7
8/// Errors.
9#[derive(PartialEq, Eq)]
10pub enum TaskCommanderError {
11    SpawnCommandFailed(String),
12    DuplicatedTask(String),
13    TaskNotFound(String),
14    DependencyCycle(String),
15    UnexpectedNode(String),
16    ZeroOrOneAttributeAllowed(String),
17    MissingDefinitions,
18}
19
20impl TaskCommanderError {
21    /// Returns a colored error message.
22    #[must_use]
23    pub fn as_text(&self, cm: ColorMode) -> Text {
24        match self {
25            Self::SpawnCommandFailed(reason) => Text::new(cm)
26                .s("failed to spawn command, reason: ")
27                .cyan()
28                .s(reason)
29                .reset(),
30            Self::DuplicatedTask(name) => {
31                Text::new(cm).s("duplicated task: ").cyan().s(name).reset()
32            }
33            Self::TaskNotFound(name) => Text::new(cm).s("task not found: ").cyan().s(name).reset(),
34            Self::DependencyCycle(name) => Text::new(cm)
35                .s("dependency cycle for task: ")
36                .cyan()
37                .s(name)
38                .reset(),
39            Self::UnexpectedNode(name) => {
40                Text::new(cm).s("unexpected node: ").cyan().s(name).reset()
41            }
42            Self::ZeroOrOneAttributeAllowed(name) => Text::new(cm)
43                .s("at most one attribute '")
44                .cyan()
45                .s(name)
46                .reset()
47                .s("' allowed"),
48            Self::MissingDefinitions => {
49                Text::new(cm).s("task definitions file is missing or inaccessible")
50            }
51        }
52    }
53}
54
55#[must_use]
56pub const fn err_command_spawn(reason: String) -> TaskCommanderError {
57    TaskCommanderError::SpawnCommandFailed(reason)
58}
59
60#[must_use]
61pub const fn err_duplicated_task(task_name: String) -> TaskCommanderError {
62    TaskCommanderError::DuplicatedTask(task_name)
63}
64
65#[must_use]
66pub const fn err_task_not_found(name: String) -> TaskCommanderError {
67    TaskCommanderError::TaskNotFound(name)
68}
69
70#[must_use]
71pub const fn err_dependency_cycle(name: String) -> TaskCommanderError {
72    TaskCommanderError::DependencyCycle(name)
73}
74
75#[must_use]
76pub const fn err_unexpected_node(name: String) -> TaskCommanderError {
77    TaskCommanderError::UnexpectedNode(name)
78}
79
80#[must_use]
81pub const fn err_zero_or_one_attribute_allowed(name: String) -> TaskCommanderError {
82    TaskCommanderError::ZeroOrOneAttributeAllowed(name)
83}
84
85#[must_use]
86pub const fn err_definitions_not_found() -> TaskCommanderError {
87    TaskCommanderError::MissingDefinitions
88}