nxd_core/domain/contract/
error.rs1use serde::{Deserialize, Serialize};
2
3pub const API_VERSION: &str = "nxd.dev/v1alpha1";
4
5#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
6#[serde(rename_all = "kebab-case")]
7pub enum ErrorCategory {
8 Operational,
9 InvalidInput,
10 Drift,
11 PolicyRejected,
12 StalePrecondition,
13 Incompatible,
14}
15
16impl ErrorCategory {
17 pub const fn exit_code(self) -> u8 {
18 match self {
19 Self::Operational => 1,
20 Self::InvalidInput => 2,
21 Self::Drift => 3,
22 Self::PolicyRejected => 4,
23 Self::StalePrecondition => 5,
24 Self::Incompatible => 6,
25 }
26 }
27}
28
29#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
30#[serde(rename_all = "camelCase", deny_unknown_fields)]
31pub struct ErrorEnvelope {
32 pub api_version: String,
33 pub kind: ErrorKind,
34 pub metadata: ErrorMetadata,
35 pub spec: ErrorSpec,
36}
37
38#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
39pub enum ErrorKind {
40 Error,
41}
42
43#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
44#[serde(deny_unknown_fields)]
45pub struct ErrorMetadata {}
46
47#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
48#[serde(rename_all = "camelCase", deny_unknown_fields)]
49pub struct ErrorSpec {
50 pub category: ErrorCategory,
51 pub exit_code: u8,
52 pub message: String,
53}
54
55impl ErrorEnvelope {
56 pub fn new(category: ErrorCategory, message: impl Into<String>) -> Self {
57 Self {
58 api_version: API_VERSION.to_string(),
59 kind: ErrorKind::Error,
60 metadata: ErrorMetadata {},
61 spec: ErrorSpec { category, exit_code: category.exit_code(), message: message.into() },
62 }
63 }
64}