statum-macros 0.7.0

Proc macros for representing legal workflow and protocol states explicitly in Rust
Documentation
#![allow(unused_imports)]
extern crate self as statum;
pub use statum_macros::__statum_emit_validator_methods_impl;
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};

#[state]
enum WorkflowState {
    Draft,
    Review(String),
}

#[machine]
struct Workflow<WorkflowState, Context, const VERSION: usize> {
    ctx: Context,
    slots: [u8; VERSION],
}

macro_rules! inspect_validator_contract {
    (
        machine = Workflow,
        state_family = WorkflowState,
        state_trait = WorkflowStateTrait,
        machine_module = workflow,
        machine_vis = $machine_vis:vis,
        extra_generics = {
            params = [
                { Context },
                { const VERSION : usize }
            ],
            args = [
                { Context },
                { VERSION }
            ],
            where_predicates = [],
        },
        fields = [
            { name = ctx, ty = $ctx_ty:ty },
            { name = slots, ty = $slots_ty:ty }
        ],
        variants = [
            { marker = Draft, validator = is_draft, data = $draft_data:ty, has_data = false },
            { marker = Review, validator = is_review, data = $review_data:ty, has_data = true }
        ],
    ) => {
        fn __assert_ctx_field<Context, const VERSION: usize>() {
            let _: core::option::Option<Context> = core::option::Option::<$ctx_ty>::None;
        }

        fn __assert_slots_field<Context, const VERSION: usize>() {
            let _: core::option::Option<[u8; VERSION]> =
                core::option::Option::<$slots_ty>::None;
        }

        fn __assert_draft_data() {
            let _: core::option::Option<()> = core::option::Option::<$draft_data>::None;
        }

        fn __assert_review_data() {
            let _: core::option::Option<String> = core::option::Option::<$review_data>::None;
        }

        fn __assert_state_trait<T: WorkflowStateTrait>() {}
        fn __assert_some_state<Context, const VERSION: usize>(
            state: workflow::SomeState<Context, VERSION>,
        ) -> workflow::SomeState<Context, VERSION> {
            let _ = stringify!($machine_vis);
            state
        }
    };
}

__statum_visit_workflow_validators!(inspect_validator_contract);

fn main() {}