Skip to main content

profile_runtime/
applicability.rs

1use 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    /// Creates the applicability context that anchors profile selection for one evaluation scope.
53    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}