Skip to main content

stack_ids/
v25.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    ApplicabilityContextId, CompiledObligationSetId, CompositionConflictSetId,
6    CompositionReceiptId, EffectiveConstitutionId, ProfileExceptionBundleId, ProfileSetId,
7};
8
9/// Canonical v25 constitutional citation shared by effect and downstream consumer artifacts.
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
11pub struct V25ConstitutionCitation {
12    pub applicability_context_id: ApplicabilityContextId,
13    pub profile_set_id: ProfileSetId,
14    pub composition_receipt_id: CompositionReceiptId,
15    pub effective_constitution_id: EffectiveConstitutionId,
16    pub compiled_obligation_set_id: CompiledObligationSetId,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub composition_conflict_set_id: Option<CompositionConflictSetId>,
19    #[serde(default)]
20    pub profile_exception_bundle_ids: Vec<ProfileExceptionBundleId>,
21}
22
23impl V25ConstitutionCitation {
24    /// Builds a complete v25 constitutional citation for a published artifact.
25    pub fn new(
26        applicability_context_id: ApplicabilityContextId,
27        profile_set_id: ProfileSetId,
28        composition_receipt_id: CompositionReceiptId,
29        effective_constitution_id: EffectiveConstitutionId,
30        compiled_obligation_set_id: CompiledObligationSetId,
31        composition_conflict_set_id: Option<CompositionConflictSetId>,
32        profile_exception_bundle_ids: Vec<ProfileExceptionBundleId>,
33    ) -> Self {
34        Self {
35            applicability_context_id,
36            profile_set_id,
37            composition_receipt_id,
38            effective_constitution_id,
39            compiled_obligation_set_id,
40            composition_conflict_set_id,
41            profile_exception_bundle_ids,
42        }
43    }
44}
45
46impl Default for V25ConstitutionCitation {
47    fn default() -> Self {
48        Self {
49            applicability_context_id: ApplicabilityContextId::new(""),
50            profile_set_id: ProfileSetId::new(""),
51            composition_receipt_id: CompositionReceiptId::new(""),
52            effective_constitution_id: EffectiveConstitutionId::new(""),
53            compiled_obligation_set_id: CompiledObligationSetId::new(""),
54            composition_conflict_set_id: None,
55            profile_exception_bundle_ids: Vec::new(),
56        }
57    }
58}