soma.cell

Approval Workflow

A multi-stage approval process using state machines.

Example 063 of the basic Soma programs: a small, commented program that teaches one thing. Every output below was printed by soma 3.2.4 when this page was built.

How it is built

The cell ApprovalWorkflow keeps 2 memory slots: requests (Map<String, String>, persistent and consistent) and status (Map<String, String>, persistent and consistent). Its state machine approval_status starts in pending and allows 7 transitions: pending -> manager_review, manager_review -> finance_review, finance_review -> approved, manager_review -> rejected, finance_review -> rejected, rejected -> pending and * -> cancelled. approved and cancelled are terminal. Handlers: submit (line 35) and demo (line 44).

Generated from soma describe on this file.

The source

063_approval_workflow.cell

// ============================================================================
// 063 — Approval Workflow
// ============================================================================
// A multi-stage approval process using state machines.
//
// Run:   soma run 063_approval_workflow.cell demo
// Expect:
//   Created request: New laptop for dev team
//   Status: pending
//   Manager reviewing
//   Finance reviewing
//   Approved!
//   Final status: approved

cell ApprovalWorkflow {

    memory {
        requests: Map<String, String> [persistent, consistent]
        // Dedicated map for state tracking
        status: Map<String, String> [persistent, consistent]
    }

    state approval_status {
        initial: pending

        pending -> manager_review
        manager_review -> finance_review
        finance_review -> approved
        manager_review -> rejected
        finance_review -> rejected
        rejected -> pending
        * -> cancelled
    }

    on submit(title: String, amount: Int) {
        let id = to_string(next_id())
        let req = map("id", id, "title", title, "amount", amount)
        requests.set(id, to_json(req))
        // Initialize state
        status.set(id, "pending")
        return req
    }

    on demo() {
        let req = submit("New laptop for dev team", 2000)
        print("Created request: {req.title}")

        let st = get_status("1")
        print("Status: {st}")

        transition("1", "manager_review")
        print("Manager reviewing")

        transition("1", "finance_review")
        print("Finance reviewing")

        transition("1", "approved")
        print("Approved!")

        let final_st = get_status("1")
        print("Final status: {final_st}")

        return "done"
    }
}

What the toolchain says

$ soma check 063_approval_workflow.cell
✓ All checks passed.
$ soma run 063_approval_workflow.cell demo
Created request: New laptop for dev team
Status: pending
Manager reviewing
Finance reviewing
Approved!
Final status: approved
done