Skip to main content

nxd_core/domain/contract/
error.rs

1use 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}