profile_runtime/
applicability.rs1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use stack_ids::{
4 ApplicabilityContextId, ContinuityPolicyProfileId, DelegationPolicyProfileId,
5 DeploymentProfileId, EffectPolicyProfileId, ProfileExceptionBundleId, ReleasePolicyProfileId,
6 ScopeKey,
7};
8
9pub const APPLICABILITY_CONTEXT_V1_SCHEMA: &str = "applicability_context_v1";
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
12pub struct ApplicabilityContextV1 {
13 pub schema_version: String,
14 pub applicability_context_id: ApplicabilityContextId,
15 pub namespace: String,
16 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub scope_key: Option<ScopeKey>,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub tenant_ref: Option<String>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub tenancy_class: Option<String>,
22 pub valid_as_of: String,
23 pub recorded_as_of: String,
24 pub target_surface_kind: String,
25 pub actor_class: String,
26 #[serde(default, skip_serializing_if = "Vec::is_empty")]
27 pub role_refs: Vec<String>,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub deployment_profile_ref: Option<DeploymentProfileId>,
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub effect_policy_profile_ref: Option<EffectPolicyProfileId>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub delegation_policy_profile_ref: Option<DelegationPolicyProfileId>,
34 #[serde(default, skip_serializing_if = "Option::is_none")]
35 pub release_policy_profile_ref: Option<ReleasePolicyProfileId>,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
37 pub continuity_policy_profile_ref: Option<ContinuityPolicyProfileId>,
38 #[serde(default, skip_serializing_if = "Option::is_none")]
39 pub effect_class: Option<String>,
40 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub incident_mode: Option<String>,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub treaty_or_disclosure_class: Option<String>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
45 pub execution_context_ref: Option<String>,
46 #[serde(default, skip_serializing_if = "Vec::is_empty")]
47 pub admitted_exception_refs: Vec<ProfileExceptionBundleId>,
48}
49
50impl ApplicabilityContextV1 {
51 #[allow(clippy::too_many_arguments)]
52 pub fn new(
54 namespace: impl Into<String>,
55 scope_key: Option<ScopeKey>,
56 valid_as_of: impl Into<String>,
57 recorded_as_of: impl Into<String>,
58 target_surface_kind: impl Into<String>,
59 actor_class: impl Into<String>,
60 role_refs: Vec<String>,
61 deployment_profile_ref: Option<DeploymentProfileId>,
62 effect_class: Option<String>,
63 incident_mode: Option<String>,
64 ) -> Self {
65 Self {
66 schema_version: APPLICABILITY_CONTEXT_V1_SCHEMA.into(),
67 applicability_context_id: ApplicabilityContextId::generate(),
68 namespace: namespace.into(),
69 scope_key,
70 tenant_ref: None,
71 tenancy_class: None,
72 valid_as_of: valid_as_of.into(),
73 recorded_as_of: recorded_as_of.into(),
74 target_surface_kind: target_surface_kind.into(),
75 actor_class: actor_class.into(),
76 role_refs,
77 deployment_profile_ref,
78 effect_policy_profile_ref: None,
79 delegation_policy_profile_ref: None,
80 release_policy_profile_ref: None,
81 continuity_policy_profile_ref: None,
82 effect_class,
83 incident_mode,
84 treaty_or_disclosure_class: None,
85 execution_context_ref: None,
86 admitted_exception_refs: Vec::new(),
87 }
88 }
89}