use serde::{Deserialize, Serialize};
use std::sync::atomic::{AtomicU64, Ordering};
static NEXT_PROGRAM: AtomicU64 = AtomicU64::new(1);
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ProgramId(u64);
impl ProgramId {
pub(crate) fn next() -> Self {
Self(NEXT_PROGRAM.fetch_add(1, Ordering::Relaxed))
}
pub fn index(self) -> u64 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
#[serde(transparent)]
pub struct WorkflowIx(u32);
impl WorkflowIx {
pub(crate) fn new(index: u32) -> Self {
Self(index)
}
pub fn index(self) -> u32 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
#[serde(transparent)]
pub struct TaskIx(u32);
impl TaskIx {
pub(crate) fn new(index: u32) -> Self {
Self(index)
}
pub fn index(self) -> u32 {
self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn program_ids_are_distinct() {
assert_ne!(ProgramId::next(), ProgramId::next());
assert!(ProgramId::next().index() > 0);
}
#[test]
fn a_position_is_its_number() {
assert_eq!(WorkflowIx::new(3).index(), 3);
assert_eq!(TaskIx::new(7).index(), 7);
assert!(TaskIx::new(1) < TaskIx::new(2));
}
}