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 AssurancePublicationStatusV1 {
10 Required,
11 AdvisoryOnly,
12 Deferred,
13 Suppressed,
14}
15
16#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
17pub struct DeploymentProfileV1 {
18 pub schema_version: String,
19 pub deployment_profile_id: String,
20 pub system_name: String,
21 pub deployment_environment: String,
22 pub criticality_class: String,
23 pub operating_envelope_id: String,
24 pub assurance_case_id: String,
25 pub publication_status: AssurancePublicationStatusV1,
26}
27
28impl DeploymentProfileV1 {
29 #[allow(clippy::too_many_arguments)]
30 pub fn new(
31 deployment_profile_id: impl Into<String>,
32 system_name: impl Into<String>,
33 deployment_environment: impl Into<String>,
34 criticality_class: impl Into<String>,
35 operating_envelope_id: impl Into<String>,
36 assurance_case_id: impl Into<String>,
37 publication_status: AssurancePublicationStatusV1,
38 ) -> Result<Self, AssuranceValidationError> {
39 let value = Self {
40 schema_version: "DeploymentProfileV1".to_string(),
41 deployment_profile_id: deployment_profile_id.into(),
42 system_name: system_name.into(),
43 deployment_environment: deployment_environment.into(),
44 criticality_class: criticality_class.into(),
45 operating_envelope_id: operating_envelope_id.into(),
46 assurance_case_id: assurance_case_id.into(),
47 publication_status,
48 };
49 value.validate()?;
50 Ok(value)
51 }
52
53 pub fn validate(&self) -> AssuranceValidationResult {
54 require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
55 require_non_empty(&self.system_name, "system_name")?;
56 require_non_empty(&self.deployment_environment, "deployment_environment")?;
57 require_non_empty(&self.criticality_class, "criticality_class")?;
58 require_non_empty(&self.operating_envelope_id, "operating_envelope_id")?;
59 require_non_empty(&self.assurance_case_id, "assurance_case_id")?;
60 Ok(())
61 }
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
65pub struct OperatingEnvelopeV1 {
66 pub schema_version: String,
67 pub operating_envelope_id: String,
68 pub allowed_regions: Vec<String>,
69 pub traffic_ceiling: String,
70 pub data_class_ceiling: String,
71 pub dependency_constraints: Vec<String>,
72 pub degradation_behavior: String,
73}
74
75impl OperatingEnvelopeV1 {
76 #[allow(clippy::too_many_arguments)]
77 pub fn new(
78 operating_envelope_id: impl Into<String>,
79 allowed_regions: Vec<String>,
80 traffic_ceiling: impl Into<String>,
81 data_class_ceiling: impl Into<String>,
82 dependency_constraints: Vec<String>,
83 degradation_behavior: impl Into<String>,
84 ) -> Result<Self, AssuranceValidationError> {
85 let value = Self {
86 schema_version: "OperatingEnvelopeV1".to_string(),
87 operating_envelope_id: operating_envelope_id.into(),
88 allowed_regions,
89 traffic_ceiling: traffic_ceiling.into(),
90 data_class_ceiling: data_class_ceiling.into(),
91 dependency_constraints,
92 degradation_behavior: degradation_behavior.into(),
93 };
94 value.validate()?;
95 Ok(value)
96 }
97
98 pub fn validate(&self) -> AssuranceValidationResult {
99 require_non_empty(&self.operating_envelope_id, "operating_envelope_id")?;
100 require_non_empty_slice(&self.allowed_regions, "allowed_regions")?;
101 require_non_empty(&self.traffic_ceiling, "traffic_ceiling")?;
102 require_non_empty(&self.data_class_ceiling, "data_class_ceiling")?;
103 require_non_empty(&self.degradation_behavior, "degradation_behavior")?;
104 Ok(())
105 }
106}
107
108#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
109pub struct HazardRegisterV1 {
110 pub schema_version: String,
111 pub hazard_register_id: String,
112 pub deployment_profile_id: String,
113 pub hazards: Vec<String>,
114 pub severity_class: String,
115 pub owner_ref: String,
116 pub last_reviewed_at: String,
117}
118
119impl HazardRegisterV1 {
120 #[allow(clippy::too_many_arguments)]
121 pub fn new(
122 hazard_register_id: impl Into<String>,
123 deployment_profile_id: impl Into<String>,
124 hazards: Vec<String>,
125 severity_class: impl Into<String>,
126 owner_ref: impl Into<String>,
127 last_reviewed_at: impl Into<String>,
128 ) -> Result<Self, AssuranceValidationError> {
129 let value = Self {
130 schema_version: "HazardRegisterV1".to_string(),
131 hazard_register_id: hazard_register_id.into(),
132 deployment_profile_id: deployment_profile_id.into(),
133 hazards,
134 severity_class: severity_class.into(),
135 owner_ref: owner_ref.into(),
136 last_reviewed_at: last_reviewed_at.into(),
137 };
138 value.validate()?;
139 Ok(value)
140 }
141
142 pub fn validate(&self) -> AssuranceValidationResult {
143 require_non_empty(&self.hazard_register_id, "hazard_register_id")?;
144 require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
145 require_non_empty_slice(&self.hazards, "hazards")?;
146 require_non_empty(&self.severity_class, "severity_class")?;
147 require_non_empty(&self.owner_ref, "owner_ref")?;
148 require_non_empty(&self.last_reviewed_at, "last_reviewed_at")?;
149 Ok(())
150 }
151}