use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum IdError {
Empty,
InvalidCharacter(char),
TooLong,
}
impl std::fmt::Display for IdError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Empty => f.write_str("ID must not be empty or whitespace"),
Self::InvalidCharacter(c) => write!(f, "ID contains invalid control character {c:?}"),
Self::TooLong => f.write_str("ID exceeds the 512 byte limit"),
}
}
}
impl std::error::Error for IdError {}
fn validate_id(value: &str) -> Result<(), IdError> {
if value.trim().is_empty() {
return Err(IdError::Empty);
}
if value.len() > 512 {
return Err(IdError::TooLong);
}
if let Some(c) = value.chars().find(|c| c.is_control()) {
return Err(IdError::InvalidCharacter(c));
}
Ok(())
}
macro_rules! define_id {
(
$(#[$meta:meta])*
$name:ident
) => {
$(#[$meta])*
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, JsonSchema)]
#[serde(transparent)]
pub struct $name(String);
impl $name {
pub fn new(value: impl Into<String>) -> Self {
Self::try_new(value).expect("invalid ID; use a lifecycle constructor")
}
pub fn try_new(value: impl Into<String>) -> Result<Self, IdError> {
let value = value.into(); validate_id(&value)?; Ok(Self(value))
}
pub fn random(domain: &str) -> Self { Self::new(format!("v1:{domain}:{}", uuid::Uuid::new_v4())) }
pub fn deterministic(domain: &str, value: impl AsRef<str>) -> Result<Self, IdError> { Self::try_new(format!("v1:{domain}:det:{}", value.as_ref())) }
pub fn version(domain: &str, version: impl AsRef<str>, value: impl AsRef<str>) -> Result<Self, IdError> { Self::try_new(format!("v1:{domain}:{}:{}", version.as_ref(), value.as_ref())) }
pub fn imported(domain: &str, value: impl AsRef<str>) -> Result<Self, IdError> { Self::try_new(format!("v1:{domain}:import:{}", value.as_ref())) }
pub fn receipt(domain: &str, value: impl AsRef<str>) -> Result<Self, IdError> { Self::try_new(format!("v1:{domain}:receipt:{}", value.as_ref())) }
pub fn local(domain: &str, value: impl AsRef<str>) -> Result<Self, IdError> { Self::try_new(format!("v1:{domain}:local:{}", value.as_ref())) }
pub fn as_str(&self) -> &str { &self.0 }
pub fn is_empty(&self) -> bool { self.0.is_empty() }
pub fn from_legacy(value: impl Into<String>) -> Result<Self, IdError> { Self::try_new(value) }
}
impl std::fmt::Display for $name { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&self.0) } }
impl From<&str> for $name { fn from(value: &str) -> Self { Self::new(value) } }
impl From<String> for $name { fn from(value: String) -> Self { Self::new(value) } }
impl AsRef<str> for $name { fn as_ref(&self) -> &str { &self.0 } }
impl FromStr for $name { type Err = IdError; fn from_str(value: &str) -> Result<Self, Self::Err> { Self::try_new(value) } }
impl<'de> Deserialize<'de> for $name {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
let value = String::deserialize(d)?; Self::try_new(value).map_err(serde::de::Error::custom)
}
}
};
}
define_id!(
EnvelopeId
);
define_id!(
ClaimId
);
define_id!(
ClaimVersionId
);
define_id!(
EntityId
);
define_id!(
EpisodeId
);
define_id!(
AttemptId
);
define_id!(
TrialId
);
define_id!(
ArtifactId
);
define_id!(
ProjectionId
);
define_id!(
RelationId
);
define_id!(
RelationVersionId
);
define_id!(
ImportBatchId
);
define_id!(
ClaimFamilyId
);
define_id!(
AssertionGroupId
);
define_id!(
RelationGroupId
);
define_id!(
JointEvidenceGroupId
);
define_id!(
ContradictionGroupId
);
define_id!(
ConstraintGroupId
);
define_id!(
KernelRunId
);
define_id!(
GraphRunId
);
define_id!(
GraphCheckpointAttemptId
);
define_id!(
QueueJobId
);
define_id!(
BatchJobId
);
define_id!(
ConstraintId
);
define_id!(
HyperedgeId
);
define_id!(
ResidualId
);
define_id!(
SyndromeId
);
define_id!(
WitnessId
);
define_id!(
CertificateId
);
define_id!(
OracleSliceId
);
define_id!(
RegionId
);
define_id!(
RegionDigestId
);
define_id!(
ArtifactTransportId
);
define_id!(
RepairRouteId
);
define_id!(
RepairCandidateId
);
define_id!(
NuisanceStateId
);
define_id!(
ConvergenceReportId
);
define_id!(
OperatorId
);
define_id!(
OperatorVersionId
);
define_id!(
RefutationResultId
);
define_id!(
CalibrationReportId
);
define_id!(
VerificationCaseId
);
define_id!(
CheckPlanId
);
define_id!(
ControlReceiptId
);
define_id!(
LedgerEntryId
);
define_id!(
PolicyDecisionId
);
define_id!(
ExecutionPermitId
);
define_id!(
ApprovalRecordId
);
define_id!(
ApprovalGrantId
);
define_id!(
PromotionDecisionId
);
define_id!(
RefutationDecisionId
);
define_id!(
RollbackPlanId
);
define_id!(
CalibrationSnapshotId
);
define_id!(
LearningUpdateId
);
define_id!(
BoundaryRepairRecordId
);
define_id!(
SemanticsProfileId
);
define_id!(
ClaimStateId
);
define_id!(
SemanticDiffId
);
define_id!(
CausalAttributionBundleId
);
define_id!(
DegradationRecordId
);
define_id!(
ExactnessBudgetId
);
define_id!(
SupportSetId
);
define_id!(
ContradictionWitnessId
);
define_id!(
RetractionRecordId
);
define_id!(
InterventionId
);
define_id!(
OutcomeSchemaId
);
define_id!(
ExperimentCaseId
);
define_id!(
CohortContractId
);
define_id!(
ComparabilityMatrixId
);
define_id!(
CounterfactualSliceId
);
define_id!(
DecisionTraceId
);
define_id!(
RefuterSuiteId
);
define_id!(
RefuterResultId
);
define_id!(
RolloutDecisionId
);
define_id!(
RollbackDecisionId
);
define_id!(
ExperimentBudgetId
);
define_id!(
AttestationEnvelopeId
);
define_id!(
TrustRootSetId
);
define_id!(
ArtifactAdmissionPolicyId
);
define_id!(
TransparencyReceiptId
);
define_id!(
AttestationRevocationId
);
define_id!(
AttestationSupersessionId
);
define_id!(
RemoteOracleLeaseId
);
define_id!(
RemoteSliceRequestId
);
define_id!(
RemoteSliceResultId
);
define_id!(
CrossRuntimeReplayTicketId
);
define_id!(
DisputeBundleId
);
define_id!(
DisclosurePolicyId
);
define_id!(
DisclosureBudgetId
);
define_id!(
TreatyBundleId
);
define_id!(
RuntimeIdentitySetId
);
define_id!(
CrossRuntimeEquivalenceBundleId
);
define_id!(
SettlementCaseId
);
define_id!(
SharedDispositionId
);
define_id!(
LocalDissentId
);
define_id!(
SharedViewDowngradeId
);
define_id!(
SettlementReceiptId
);
define_id!(
SharedReplaySliceId
);
define_id!(
SharedDivergenceReportId
);
define_id!(
TreatySuspensionId
);
define_id!(
MechanismBundleId
);
define_id!(
TheoryVersionId
);
define_id!(
TheoryLibraryId
);
define_id!(
HypothesisLibraryId
);
define_id!(
SimulationContractId
);
define_id!(
FitRunId
);
define_id!(
TheoryRefuterSuiteId
);
define_id!(
RolloutStabilityReportId
);
define_id!(
DiscoveryProgramId
);
define_id!(
PortfolioPlanId
);
define_id!(
ExperimentCampaignId
);
define_id!(
CampaignDecisionTraceId
);
define_id!(
InformationValueEstimateId
);
define_id!(
VerificationLoadBudgetId
);
define_id!(
CharterBundleId
);
define_id!(
DoctrineSnapshotId
);
define_id!(
AmendmentProposalId
);
define_id!(
AmendmentDecisionId
);
define_id!(
ArchiveManifestId
);
define_id!(
CompactionReceiptId
);
define_id!(
HistoricalQueryGuaranteeId
);
define_id!(
DeprecationBundleId
);
define_id!(
RetirementBundleId
);
define_id!(
SpecBundleId
);
define_id!(
NormativeAstId
);
define_id!(
GeneratedSchemaBundleId
);
define_id!(
GeneratedInterpreterBundleId
);
define_id!(
GeneratedConformanceCorpusId
);
define_id!(
GeneratedMigrationPlanId
);
define_id!(
ProofObligationSetId
);
define_id!(
ProofEvaluationReceiptId
);
define_id!(
HumanVetoBundleId
);
define_id!(
MetaChallengeBundleId
);
define_id!(
SelfHostingBuildReceiptId
);
define_id!(
EffectIntentId
);
define_id!(
EffectPreflightReportId
);
define_id!(
EffectWindowId
);
define_id!(
EffectCommitDecisionId
);
define_id!(
EffectExecutionReceiptId
);
define_id!(
EffectObservationBundleId
);
define_id!(
CompensationPlanId
);
define_id!(
CompensationExecutionReceiptId
);
define_id!(
ExternalEffectLedgerEntryId
);
define_id!(
CapabilityClassId
);
define_id!(
AuthorityLeaseId
);
define_id!(
DelegationBundleId
);
define_id!(
AuthorityChainId
);
define_id!(
SeparationOfDutiesPolicyId
);
define_id!(
DualControlApprovalId
);
define_id!(
BreakGlassGrantId
);
define_id!(
DelegationRevocationId
);
define_id!(
ActingOnBehalfReceiptId
);
define_id!(
ConflictDisclosureId
);
define_id!(
DeploymentProfileId
);
define_id!(
OperatingEnvelopeId
);
define_id!(
AssuranceCaseId
);
define_id!(
HazardRegisterId
);
define_id!(
ControlMappingId
);
define_id!(
ResidualRiskAcceptanceId
);
define_id!(
ReleaseReadinessDecisionId
);
define_id!(
FieldMonitoringPlanId
);
define_id!(
CertificationBundleId
);
define_id!(
RecertificationTriggerId
);
define_id!(
ServiceLevelProfileId
);
define_id!(
ErrorBudgetLedgerId
);
define_id!(
IncidentCaseId
);
define_id!(
ContainmentDecisionId
);
define_id!(
ForensicFreezeId
);
define_id!(
RecoveryPlanId
);
define_id!(
RecoveryReplaySliceId
);
define_id!(
ContinuityExceptionId
);
define_id!(
PostmortemBundleId
);
define_id!(
ResilienceExerciseId
);
define_id!(
EffectReviewCaseId
);
define_id!(
EffectBlockReceiptId
);
define_id!(
DelegationReviewCaseId
);
define_id!(
ReleaseGateCaseId
);
define_id!(
ContinuityReviewCaseId
);
define_id!(
EffectPolicyProfileId
);
define_id!(
DelegationPolicyProfileId
);
define_id!(
ReleasePolicyProfileId
);
define_id!(
ContinuityPolicyProfileId
);
define_id!(
EffectAdjudicationReceiptId
);
define_id!(
ReleaseRollbackDecisionId
);
define_id!(
ToolEffectDispatchReceiptId
);
define_id!(
PrivacyRetentionProfileId
);
define_id!(
RedactionRuleSetId
);
define_id!(
AccessPurposeMatrixId
);
define_id!(
AuditExtractionPolicyId
);
define_id!(
ResidencyPolicyProfileId
);
define_id!(
TenantBoundaryProfileId
);
define_id!(
CrossBoundaryTransferClassId
);
define_id!(
LocalityExceptionId
);
define_id!(
RoleCatalogId
);
define_id!(
DelegationMatrixId
);
define_id!(
ApprovalMatrixId
);
define_id!(
ConflictClassCatalogId
);
define_id!(
RegulatoryRegimeProfileId
);
define_id!(
RequirementControlMapId
);
define_id!(
EvidenceCollectionPlanId
);
define_id!(
RecertificationScheduleId
);
define_id!(
HazardLibraryId
);
define_id!(
HazardScenarioId
);
define_id!(
MonitorCatalogId
);
define_id!(
MitigationPlaybookId
);
define_id!(
VendorCertificationAdapterId
);
define_id!(
VendorEvidenceTranslationId
);
define_id!(
VendorTrustRootBindingId
);
define_id!(
VendorRevocationHandlingId
);
define_id!(
IncidentTaxonomyId
);
define_id!(
SeverityMatrixId
);
define_id!(
PagerRouteProfileId
);
define_id!(
EscalationClockPolicyId
);
define_id!(
ApplicabilityContextId
);
define_id!(
ProfileSetId
);
define_id!(
CompositionRuleSetId
);
define_id!(
CompositionReceiptId
);
define_id!(
EffectiveConstitutionId
);
define_id!(
CompiledObligationSetId
);
define_id!(
CompositionConflictSetId
);
define_id!(
ProfileExceptionBundleId
);
define_id!(
PolicyImpactDiffId
);
impl AttemptId {
pub fn generate() -> Self {
Self::random("attempt")
}
}
impl TrialId {
pub fn generate() -> Self {
Self::random("trial")
}
}
macro_rules! impl_generate {
($name:ident, $domain:literal) => {
impl $name {
pub fn generate() -> Self {
Self::random($domain)
}
}
};
}
impl_generate!(ClaimId, "claim");
impl_generate!(ClaimVersionId, "claim_version");
impl_generate!(EpisodeId, "episode");
impl_generate!(RelationVersionId, "relation_version");
impl_generate!(FitRunId, "fit_run");
impl_generate!(CampaignDecisionTraceId, "campaign_decision");
impl_generate!(AmendmentDecisionId, "amendment_decision");
impl_generate!(ApprovalGrantId, "approval_grant");
impl_generate!(ArchiveManifestId, "archive_manifest");
impl_generate!(HistoricalQueryGuaranteeId, "historical_query");
impl_generate!(CompactionReceiptId, "compaction_receipt");
impl_generate!(ProofEvaluationReceiptId, "proof_eval_receipt");
impl_generate!(SelfHostingBuildReceiptId, "self_hosting_build");
impl_generate!(SettlementReceiptId, "settlement_receipt");
impl_generate!(SharedDivergenceReportId, "shared_divergence");
impl_generate!(SharedReplaySliceId, "shared_replay_slice");
impl_generate!(SharedViewDowngradeId, "shared_view_downgrade");
impl_generate!(TreatySuspensionId, "treaty_suspension");
impl_generate!(GeneratedConformanceCorpusId, "gen_conformance_corpus");
impl_generate!(GeneratedInterpreterBundleId, "gen_interpreter_bundle");
impl_generate!(GeneratedMigrationPlanId, "gen_migration_plan");
impl_generate!(GeneratedSchemaBundleId, "gen_schema_bundle");
impl_generate!(VerificationCaseId, "verification_case");
impl_generate!(ExecutionPermitId, "execution_permit");
impl_generate!(PolicyDecisionId, "policy_decision");
impl_generate!(CheckPlanId, "check_plan");
impl_generate!(ControlReceiptId, "control_receipt");
impl_generate!(LedgerEntryId, "ledger_entry");
impl_generate!(RepairCandidateId, "repair_candidate");
impl_generate!(RepairRouteId, "repair_route");
impl_generate!(EffectBlockReceiptId, "effect_block_receipt");
impl_generate!(EffectReviewCaseId, "effect_review_case");
impl_generate!(ContinuityReviewCaseId, "continuity_review_case");
impl_generate!(DelegationReviewCaseId, "delegation_review_case");
impl_generate!(ReleaseGateCaseId, "release_gate_case");
impl_generate!(ExactnessBudgetId, "exactness_budget");
impl_generate!(ArtifactTransportId, "artifact_transport");
impl_generate!(BoundaryRepairRecordId, "boundary_repair_record");
impl_generate!(CalibrationSnapshotId, "calibration_snapshot");
impl_generate!(NuisanceStateId, "nuisance_state");
impl_generate!(ApprovalRecordId, "approval_record");
impl_generate!(ApplicabilityContextId, "applicability_context");
impl_generate!(CompiledObligationSetId, "compiled_obligation_set");
impl_generate!(CompositionConflictSetId, "composition_conflict_set");
impl_generate!(CompositionReceiptId, "composition_receipt");
impl_generate!(CompositionRuleSetId, "composition_rule_set");
impl_generate!(EffectiveConstitutionId, "effective_constitution");
impl_generate!(PolicyImpactDiffId, "policy_impact_diff");
impl_generate!(ProfileSetId, "profile_set");
impl_generate!(PromotionDecisionId, "promotion_decision");
impl_generate!(RefutationDecisionId, "refutation_decision");
impl_generate!(RollbackPlanId, "rollback_plan");
#[cfg(test)]
#[path = "ids_tests.rs"]
mod tests;