From 4c1cf0c3d7a77d235a4542010766557f2e47f889 Mon Sep 17 00:00:00 2001 From: Gabriele Romano Date: Wed, 8 Jul 2026 10:37:57 +0200 Subject: [PATCH] feat: add wildcard support for transitions and implement state configuration validation --- FsmTD.tox | Bin 7134 -> 17054 bytes README.md | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/FsmTD.tox b/FsmTD.tox index 999bf1e2aab43de9f3fe134882008288cabb847f..e85592a9297282786d7d07e7f148b1ae217c4491 100644 GIT binary patch literal 17054 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 NWI|@L)_$Il3ete!S8M

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 diff --git a/README.md b/README.md index 4c81c2d..181c7a6 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,16 @@ Requires a single column: `state_name`. List all possible states here. ### Transitions Table Requires four columns: `source`, `event`, `target`, and `timeout`. -* `source`: The state you are leaving. +* `source`: The state you are leaving. Supports wildcard `*` (allows transitioning from any state to the target state). Wildcard transitions have the highest priority. * `event`: The trigger required to leave. * `target`: The destination state. * `timeout`: (Optional) Float value in seconds. The FSM will automatically trigger the transition after this time elapses. +## ⚠️ State Validation & Error Handling +To help you build and debug your FSM, the component validates your configuration tables on load: +* **Missing Source State**: If a source state in the transitions table does not exist in the states table, a **warning** is raised. (Note: The wildcard `*` is a valid source state). +* **Missing Target State**: If a target state in the transitions table does not exist in the states table, an **error** is raised to prevent entering undefined states. + ## 🤝 Contributing Pull requests are welcome! If you build something cool with this, let me know and remember to mention us. Feel free to open issues for bug reports, feature requests, or just to say hi!