Skip to main content

coil_ops/
error.rs

1use coil_auth::Capability;
2use coil_jobs::JobsModelError;
3use std::error::Error;
4use std::fmt;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum OpsModelError {
8    EmptyField {
9        field: &'static str,
10    },
11    InvalidToken {
12        field: &'static str,
13        value: String,
14    },
15    DuplicateIdentifier {
16        kind: &'static str,
17        id: String,
18    },
19    DuplicateField {
20        index_id: String,
21        field_id: String,
22    },
23    MissingCapability {
24        operation: &'static str,
25        required: Capability,
26    },
27    InvalidSearchVisibility {
28        index_id: String,
29        reason: String,
30    },
31    InvalidReportDelivery {
32        report_id: String,
33        reason: String,
34    },
35    InvalidBulkOperation {
36        operation_id: String,
37        reason: String,
38    },
39    InvalidRecoveryWorkflow {
40        workflow_id: String,
41        reason: String,
42    },
43    InvalidItemCount {
44        operation: &'static str,
45        count: usize,
46    },
47    MissingOperatorAcknowledgement {
48        workflow_id: String,
49        requirement: String,
50    },
51    JobsPlan {
52        error: JobsModelError,
53    },
54}
55
56impl fmt::Display for OpsModelError {
57    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58        match self {
59            Self::EmptyField { field } => write!(f, "`{field}` cannot be empty"),
60            Self::InvalidToken { field, value } => {
61                write!(f, "`{field}` contains an invalid token `{value}`")
62            }
63            Self::DuplicateIdentifier { kind, id } => write!(f, "{kind} `{id}` is duplicated"),
64            Self::DuplicateField { index_id, field_id } => {
65                write!(f, "search index `{index_id}` duplicates field `{field_id}`")
66            }
67            Self::MissingCapability {
68                operation,
69                required,
70            } => {
71                write!(f, "{operation} requires capability `{required}`")
72            }
73            Self::InvalidSearchVisibility { index_id, reason } => {
74                write!(
75                    f,
76                    "search index `{index_id}` has invalid visibility: {reason}"
77                )
78            }
79            Self::InvalidReportDelivery { report_id, reason } => {
80                write!(
81                    f,
82                    "report `{report_id}` has invalid delivery policy: {reason}"
83                )
84            }
85            Self::InvalidBulkOperation {
86                operation_id,
87                reason,
88            } => {
89                write!(f, "bulk operation `{operation_id}` is invalid: {reason}")
90            }
91            Self::InvalidRecoveryWorkflow {
92                workflow_id,
93                reason,
94            } => {
95                write!(f, "recovery workflow `{workflow_id}` is invalid: {reason}")
96            }
97            Self::InvalidItemCount { operation, count } => {
98                write!(f, "{operation} cannot target `{count}` items")
99            }
100            Self::MissingOperatorAcknowledgement {
101                workflow_id,
102                requirement,
103            } => {
104                write!(
105                    f,
106                    "recovery workflow `{workflow_id}` requires operator acknowledgement: {requirement}"
107                )
108            }
109            Self::JobsPlan { error } => write!(f, "{error}"),
110        }
111    }
112}
113
114impl Error for OpsModelError {}
115
116impl From<JobsModelError> for OpsModelError {
117    fn from(error: JobsModelError) -> Self {
118        Self::JobsPlan { error }
119    }
120}