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}