use core::marker::PhantomData;
use crate::law::{Assert, IsTrue};
use crate::witness::{Witness, WitnessFamily};
pub const fn family_eq(a: WitnessFamily, b: WitnessFamily) -> bool {
a as u8 == b as u8
}
pub const fn str_eq(a: &str, b: &str) -> bool {
let a = a.as_bytes();
let b = b.as_bytes();
if a.len() != b.len() {
return false;
}
let mut i = 0;
while i < a.len() {
if a[i] != b[i] {
return false;
}
i += 1;
}
true
}
mod sealed {
pub trait IsStandard {}
pub trait IsPaper {}
pub trait IsApiGrammar {}
pub trait IsRustLaw {}
pub trait IsInternalBridge {}
}
#[diagnostic::on_unimplemented(
message = "`{Self}` is not a Standard-family authority",
label = "only normative-standard witnesses (ISO/IEEE/OMG) satisfy `StandardAuthority`",
note = "use a `WitnessFamily::Standard` witness (e.g. `Ocel20`, `Xes1849`), or `PaperAuthority` for a published paper"
)]
pub trait StandardAuthority: Witness + sealed::IsStandard {}
#[diagnostic::on_unimplemented(
message = "`{Self}` is not a Paper-family authority",
label = "only academic-paper witnesses satisfy `PaperAuthority`",
note = "use a `WitnessFamily::Paper` witness (e.g. `AlphaMiner`, `PowlPaper`), or `StandardAuthority` for a normative standard"
)]
pub trait PaperAuthority: Witness + sealed::IsPaper {}
#[diagnostic::on_unimplemented(
message = "`{Self}` is not an ApiGrammar-family authority",
label = "only consumer-grammar witnesses satisfy `ApiGrammarAuthority`",
note = "use a `WitnessFamily::ApiGrammar` witness (e.g. `Pm4pyApiGrammar`, `PmaxConsumerGrammar`)"
)]
pub trait ApiGrammarAuthority: Witness + sealed::IsApiGrammar {}
#[diagnostic::on_unimplemented(
message = "`{Self}` is not a RustLaw-family authority",
label = "only Rust-language-law witnesses satisfy `RustLawAuthority`",
note = "use a `WitnessFamily::RustLaw` witness (e.g. `RustTypestateLaw`)"
)]
pub trait RustLawAuthority: Witness + sealed::IsRustLaw {}
#[diagnostic::on_unimplemented(
message = "`{Self}` is not an InternalBridge-family authority",
label = "only graduation-bridge witnesses satisfy `InternalBridgeAuthority`",
note = "use a `WitnessFamily::InternalBridge` witness (e.g. `Wasm4pmBridge`, `ConformanceWitness`)"
)]
pub trait InternalBridgeAuthority: Witness + sealed::IsInternalBridge {}
use crate::witness::{Ocel20, OcelAttributeType, OcelEventType, OcelObjectType, Xes1849};
use crate::witnesses::{XesConceptExt, XesLifecycleExt};
impl sealed::IsStandard for Ocel20 {}
impl StandardAuthority for Ocel20 {}
impl sealed::IsStandard for OcelAttributeType {}
impl StandardAuthority for OcelAttributeType {}
impl sealed::IsStandard for OcelEventType {}
impl StandardAuthority for OcelEventType {}
impl sealed::IsStandard for OcelObjectType {}
impl StandardAuthority for OcelObjectType {}
impl sealed::IsStandard for Xes1849 {}
impl StandardAuthority for Xes1849 {}
impl sealed::IsStandard for XesConceptExt {}
impl StandardAuthority for XesConceptExt {}
impl sealed::IsStandard for XesLifecycleExt {}
impl StandardAuthority for XesLifecycleExt {}
use crate::witness::{
AlphaMiner, DeclareFamily, ObjectCentricPetriNetPaper, OcpqPaper, PowlPaper,
PredictiveMonitoringFamily, ReceiptFamily, WfNetSoundnessPaper, YawlPaper,
};
use crate::witnesses::{
AggregationView, AlignmentPaper, AnalyticalView, CausalConsistencyWitness,
ControlFlowPerspectiveWitness, ConvergenceWitness, CrossLogCorrelationWitness,
DataPerspectiveWitness, DeclareConstraints, DivergenceWitness, InductiveMiner, LogSkeleton,
OcPetriNets, OcpqPaper as OcpqPaperFull, OperationalView, ProcessCubePaper,
ResourcePerspectiveWitness, SeparableWfNetPaper, StreamingEvidenceWitness,
TemporalProfileWitness, TimeAwareWitness, TimePerspectiveWitness, WfNet2Powl,
WorkflowPatternsPaper,
};
macro_rules! impl_paper {
($($t:ty),+ $(,)?) => {
$(
impl sealed::IsPaper for $t {}
impl PaperAuthority for $t {}
)+
};
}
impl_paper!(
AlphaMiner,
DeclareFamily,
OcpqPaper,
ObjectCentricPetriNetPaper,
PowlPaper,
PredictiveMonitoringFamily,
ReceiptFamily,
WfNetSoundnessPaper,
YawlPaper,
AggregationView,
AlignmentPaper,
AnalyticalView,
CausalConsistencyWitness,
ControlFlowPerspectiveWitness,
ConvergenceWitness,
CrossLogCorrelationWitness,
DataPerspectiveWitness,
DeclareConstraints,
DivergenceWitness,
InductiveMiner,
LogSkeleton,
OcPetriNets,
OcpqPaperFull,
OperationalView,
ProcessCubePaper,
ResourcePerspectiveWitness,
SeparableWfNetPaper,
StreamingEvidenceWitness,
TemporalProfileWitness,
TimeAwareWitness,
TimePerspectiveWitness,
WfNet2Powl,
WorkflowPatternsPaper,
);
use crate::witness::{Pm4pyApiGrammar, PmaxConsumerGrammar};
use crate::witnesses::Pm4pyApiGrammar as Pm4pyFullModule;
use crate::witnesses::PmaxConsumerGrammar as PmaxFullModule;
impl sealed::IsApiGrammar for Pm4pyApiGrammar {}
impl ApiGrammarAuthority for Pm4pyApiGrammar {}
impl sealed::IsApiGrammar for PmaxConsumerGrammar {}
impl ApiGrammarAuthority for PmaxConsumerGrammar {}
impl sealed::IsApiGrammar for Pm4pyFullModule {}
impl ApiGrammarAuthority for Pm4pyFullModule {}
impl sealed::IsApiGrammar for PmaxFullModule {}
impl ApiGrammarAuthority for PmaxFullModule {}
use crate::witness::RustTypestateLaw;
use crate::witnesses::RustTypestateLaw as RustTypestateLawFull;
impl sealed::IsRustLaw for RustTypestateLaw {}
impl RustLawAuthority for RustTypestateLaw {}
impl sealed::IsRustLaw for RustTypestateLawFull {}
impl RustLawAuthority for RustTypestateLawFull {}
use crate::witness::Wasm4pmBridge;
use crate::witnesses::{
ConformanceWitness, LifecycleWitness, MiningWitness, ReplayWitness,
Wasm4pmBridge as Wasm4pmBridgeFull,
};
macro_rules! impl_bridge {
($($t:ty),+ $(,)?) => {
$(
impl sealed::IsInternalBridge for $t {}
impl InternalBridgeAuthority for $t {}
)+
};
}
impl_bridge!(
Wasm4pmBridge,
Wasm4pmBridgeFull,
ConformanceWitness,
LifecycleWitness,
MiningWitness,
ReplayWitness,
);
pub struct StandardWitness<W: StandardAuthority> {
_w: PhantomData<W>,
}
impl<W: StandardAuthority> StandardWitness<W> {
pub fn new() -> Self {
Self { _w: PhantomData }
}
}
impl<W: StandardAuthority> Default for StandardWitness<W> {
fn default() -> Self {
Self::new()
}
}
pub struct PaperWitness<W: PaperAuthority> {
_w: PhantomData<W>,
}
impl<W: PaperAuthority> PaperWitness<W> {
pub fn new() -> Self {
Self { _w: PhantomData }
}
}
impl<W: PaperAuthority> Default for PaperWitness<W> {
fn default() -> Self {
Self::new()
}
}
pub struct CoCitedKey<T, const K1: &'static str, const K2: &'static str>
where
Assert<{ !str_eq(K1, K2) }>: IsTrue,
{
pub value: T,
}
impl<T, const K1: &'static str, const K2: &'static str> CoCitedKey<T, K1, K2>
where
Assert<{ !str_eq(K1, K2) }>: IsTrue,
{
pub fn new(value: T) -> Self {
Self { value }
}
}
pub struct FamilyGated<const F: WitnessFamily>(PhantomData<[u8; 0]>);
impl<const F: WitnessFamily> FamilyGated<F> {
pub fn new() -> Self {
FamilyGated(PhantomData)
}
pub const fn family() -> WitnessFamily {
F
}
}
impl<const F: WitnessFamily> Default for FamilyGated<F> {
fn default() -> Self {
Self::new()
}
}