statum-macros 0.8.2

Proc macros for representing legal workflow and protocol states explicitly in Rust
Documentation
#![allow(unused_imports)]
extern crate self as statum;
pub use statum_core::__private;
pub use statum_core::TransitionInventory;
pub use statum_core::{
    CanTransitionMap, CanTransitionTo, CanTransitionWith, DataState, Error, MachineDescriptor,
    MachineGraph, MachineIntrospection, MachineStateIdentity, RebuildAttempt, RebuildReport, StateDescriptor, StateMarker,
    TransitionDescriptor, UnitState,
};

use statum_macros::{machine, state, validators};


#[state]
pub enum JobState {
    Queued,
    Running(JobData),
    Complete,
}

pub struct JobData {
    id: u64,
}

#[machine]
pub struct JobMachine<JobState> {
    worker: String,
}

pub struct JobRow {
    status: &'static str,
}

#[validators(JobMachine)]
impl JobRow {
    async fn is_queued(&self) -> Result<(), statum_core::Error> {
        let _ = worker;
        if self.status == "queued" {
            Ok(())
        } else {
            Err(statum_core::Error::InvalidState)
        }
    }

    async fn is_running(&self) -> Result<JobData, statum_core::Error> {
        let _ = worker;
        if self.status == "running" {
            Ok(JobData { id: 1 })
        } else {
            Err(statum_core::Error::InvalidState)
        }
    }

    async fn is_complete(&self) -> Result<(), statum_core::Error> {
        let _ = worker;
        if self.status == "complete" {
            Ok(())
        } else {
            Err(statum_core::Error::InvalidState)
        }
    }
}

fn main() {
    let row = JobRow { status: "queued" };
    let _ = row.into_machine().worker("w1".to_string()).build();
    let _ = async {
        vec![JobRow { status: "running" }]
            .into_machines()
            .worker("w1".to_string())
            .build()
            .await
    };
}