Skip to main content

assurance_runtime/
profile.rs

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}