1use crate::error::{
2 require_non_empty, require_non_empty_slice, AssuranceValidationError, AssuranceValidationResult,
3};
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8#[serde(rename_all = "snake_case")]
9pub enum CertificationStatusV1 {
10 AdvisoryUntilAdmitted,
11 Admitted,
12 Revoked,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
16#[serde(rename_all = "snake_case")]
17pub enum RecertificationTriggerKindV1 {
18 SloBreach,
19 Incident,
20 ControlGap,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
24pub struct FieldMonitoringPlanV1 {
25 pub schema_version: String,
26 pub field_monitoring_plan_id: String,
27 pub deployment_profile_id: String,
28 pub monitors: Vec<String>,
29 pub sampling_window: String,
30 pub alert_routes: Vec<String>,
31 pub recertification_triggers: Vec<String>,
32}
33
34impl FieldMonitoringPlanV1 {
35 #[allow(clippy::too_many_arguments)]
36 pub fn new(
37 field_monitoring_plan_id: impl Into<String>,
38 deployment_profile_id: impl Into<String>,
39 monitors: Vec<String>,
40 sampling_window: impl Into<String>,
41 alert_routes: Vec<String>,
42 recertification_triggers: Vec<String>,
43 ) -> Result<Self, AssuranceValidationError> {
44 let value = Self {
45 schema_version: "FieldMonitoringPlanV1".to_string(),
46 field_monitoring_plan_id: field_monitoring_plan_id.into(),
47 deployment_profile_id: deployment_profile_id.into(),
48 monitors,
49 sampling_window: sampling_window.into(),
50 alert_routes,
51 recertification_triggers,
52 };
53 value.validate()?;
54 Ok(value)
55 }
56
57 pub fn validate(&self) -> AssuranceValidationResult {
58 require_non_empty(&self.field_monitoring_plan_id, "field_monitoring_plan_id")?;
59 require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
60 require_non_empty_slice(&self.monitors, "monitors")?;
61 require_non_empty(&self.sampling_window, "sampling_window")?;
62 require_non_empty_slice(&self.alert_routes, "alert_routes")?;
63 Ok(())
64 }
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
68pub struct CertificationBundleV1 {
69 pub schema_version: String,
70 pub certification_bundle_id: String,
71 pub deployment_profile_id: String,
72 pub assurance_case_id: String,
73 pub release_readiness_decision_id: String,
74 pub issued_by: Vec<String>,
75 pub issued_at: String,
76 pub status: CertificationStatusV1,
77}
78
79impl CertificationBundleV1 {
80 #[allow(clippy::too_many_arguments)]
81 pub fn new(
82 certification_bundle_id: impl Into<String>,
83 deployment_profile_id: impl Into<String>,
84 assurance_case_id: impl Into<String>,
85 release_readiness_decision_id: impl Into<String>,
86 issued_by: Vec<String>,
87 issued_at: impl Into<String>,
88 status: CertificationStatusV1,
89 ) -> Result<Self, AssuranceValidationError> {
90 let value = Self {
91 schema_version: "CertificationBundleV1".to_string(),
92 certification_bundle_id: certification_bundle_id.into(),
93 deployment_profile_id: deployment_profile_id.into(),
94 assurance_case_id: assurance_case_id.into(),
95 release_readiness_decision_id: release_readiness_decision_id.into(),
96 issued_by,
97 issued_at: issued_at.into(),
98 status,
99 };
100 value.validate()?;
101 Ok(value)
102 }
103
104 pub fn validate(&self) -> AssuranceValidationResult {
105 require_non_empty(&self.certification_bundle_id, "certification_bundle_id")?;
106 require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
107 require_non_empty(&self.assurance_case_id, "assurance_case_id")?;
108 require_non_empty(
109 &self.release_readiness_decision_id,
110 "release_readiness_decision_id",
111 )?;
112 require_non_empty_slice(&self.issued_by, "issued_by")?;
113 require_non_empty(&self.issued_at, "issued_at")?;
114 Ok(())
115 }
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
119pub struct RecertificationTriggerV1 {
120 pub schema_version: String,
121 pub recertification_trigger_id: String,
122 pub deployment_profile_id: String,
123 pub trigger_kind: RecertificationTriggerKindV1,
124 pub triggered_at: String,
125 pub required_action: String,
126}
127
128impl RecertificationTriggerV1 {
129 #[allow(clippy::too_many_arguments)]
130 pub fn new(
131 recertification_trigger_id: impl Into<String>,
132 deployment_profile_id: impl Into<String>,
133 trigger_kind: RecertificationTriggerKindV1,
134 triggered_at: impl Into<String>,
135 required_action: impl Into<String>,
136 ) -> Result<Self, AssuranceValidationError> {
137 let value = Self {
138 schema_version: "RecertificationTriggerV1".to_string(),
139 recertification_trigger_id: recertification_trigger_id.into(),
140 deployment_profile_id: deployment_profile_id.into(),
141 trigger_kind,
142 triggered_at: triggered_at.into(),
143 required_action: required_action.into(),
144 };
145 value.validate()?;
146 Ok(value)
147 }
148
149 pub fn validate(&self) -> AssuranceValidationResult {
150 require_non_empty(
151 &self.recertification_trigger_id,
152 "recertification_trigger_id",
153 )?;
154 require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
155 require_non_empty(&self.triggered_at, "triggered_at")?;
156 require_non_empty(&self.required_action, "required_action")?;
157 Ok(())
158 }
159}