statum 0.8.10

Represent workflow and protocol state correctly in Rust by making invalid states unrepresentable
Documentation

statum

statum is about representational correctness when a value's phase should change what methods are legally available on that value. It helps make invalid, undesirable, or not-yet-validated states impossible to represent as ordinary values.

It applies the same idea as Option and Result: absence or failure becomes explicit in the type instead of staying implicit in the program.

This crate re-exports:

  • attribute macros: #[state], #[machine], #[transition], #[validators]
  • runtime types: statum::Error, statum::Result<T>
  • advanced traits: StateMarker, UnitState, DataState, CanTransition*
  • typed introspection and runtime-join surfaces: MachineIntrospection, MachineGraph, MachineTransitionRecorder, MachinePresentation
  • projection helpers: statum::projection

Install

[dependencies]
statum = "0.8.10"

Statum targets stable Rust and currently supports Rust 1.93+.

Mental Model

  • Use statum when pressing . before and after a phase change should show a meaningfully different method surface.
  • Durable workflows and protocols are one strong fit. Staged validation, resolution, and build surfaces are another.
  • #[state] defines the legal phases
  • #[machine] defines the durable context
  • #[transition] defines the legal edges
  • #[validators] rebuilds typed machines from stored data

Minimal Example

use statum::{machine, state, transition};

#[state]
enum LightState {
    Off,
    On,
}

#[machine]
struct Light<LightState> {
    name: String,
}

#[transition]
impl Light<Off> {
    fn switch_on(self) -> Light<On> {
        self.transition()
    }
}

#[transition]
impl Light<On> {
    fn switch_off(self) -> Light<Off> {
        self.transition()
    }
}

# fn main() {}

Docs