aboutsummaryrefslogblamecommitdiff
path: root/README.md
blob: df1e04f5098b0934d97638872bb627f072995ffa (plain) (tree)












































                                                                                          
# Workflow for Go

Simple state machine. Inspired by [Symfony Workflow](https://github.com/symfony/workflow).

## Example usage

```go
o := new(ObjectImplementedPlaceer)

w := NewWorkflow("initial")
w.AddTransition("From initial to A", []Place{"initial"}, "A")
w.AddTransition("From initial to B", []Place{"initial"}, "B")
w.AddTransition("From A to C", []Place{"A"}, "C")
w.AddTransition("From B,C to D", []Place{"B", "C"}, "D")
w.AddTransition("From C,D to Finish", []Place{"C", "D"}, "Finish")

w.Can(o, "From initial to A") // == nil
w.Can(o, "From A to C") // == ErrCantApply

w.GetEnabledTransitions(o) // []string{"From initial to A", "From initial to B"}
w.Apply(o, "From inital to A") // o now at "A" place
w.GetEnabledTransitions(o) // []string{"From A to C"}

w.DumpToDot() // See above
```

## Dump result

```
digraph {
        initial[color="blue"];
        initial -> A[label="From initial to A"];
        initial -> B[label="From initial to B"];
        A -> C[label="From A to C"];
        B -> D[label="From B,C to D"];
        C -> D[label="From B,C to D"];
        C -> Finish[label="From C,D to Finish"];
        D -> Finish[label="From C,D to Finish"];
}
```

Visualization:

![Workflow visualization](images/example.png)