+++ title = "Workflow" name = "workflow" repository = "https://git.neonxp.ru/workflow.git" description = "Простой конечный автомат для Go" gomod = true outputs = ["html"] +++ Простой конечный автомат, похожий на [Symfony Workflow](https://github.com/symfony/workflow). ## Пример ```go o := new(ObjectImplementedPlaceer) w := NewWorkflow("Start") w.AddTransition("Start", "A") w.AddTransition("Start", "B") w.AddTransition("A", "C") w.AddTransition("B", "D") w.AddTransition( "C", "D") w.AddTransition("C", "Finish") w.AddTransition("D", "Finish") w.Can(o, "A") // == nil w.Can(o, "C") // == ErrTransitionNotFound w.GetEnabledTransitions(o) // []Place{"A", "B"} w.Apply(o, "A") // o now at "A" place w.GetEnabledTransitions(o) // []Place{"C"} w.DumpToDot() // See above ``` ## Дамп в формат dot ``` digraph { Start[color="blue"] Start -> A[label="Start → A"]; Start -> B[label="Start → B"]; A -> C[label="A → C"]; B -> D[label="B → D"]; C -> D[label="C → D"]; C -> Finish[label="C → Finish"]; D -> Finish[label="D → Finish"]; } ``` {{< graph >}} flowchart TD Start -->|Start → A| A Start -->|Start → B| B A -->|A → C| C B -->|B → D| D C -->|C → D| D C -->|C → Finish| Finish D -->|D → Finish| Finish {{< /graph >}}