An open API service indexing awesome lists of open source software.

https://github.com/mustaddon/fsmworkflow

Finite-state machine (FSM) based workflow
https://github.com/mustaddon/fsmworkflow

Last synced: 10 months ago
JSON representation

Finite-state machine (FSM) based workflow

Awesome Lists containing this project

README

          

# FsmWorkflow [![NuGet version](https://badge.fury.io/nu/RandomSolutions.FsmWorkflow.svg)](http://badge.fury.io/nu/RandomSolutions.FsmWorkflow)
Finite-state machine (FSM) based workflow

### Example #1 - Code based workflow declaration
```C#
public enum State { S1, S2, S3 }
public enum Action { A1, A2, A3 }

public class SampleObject
{
public string Title { get; set; }
public State State { get; set; }
}

public class SampleWorkflow : IFsmWorkflowBuilder
{
public IStateMachine Build(SampleObject obj)
{
return new FsmBuilder(obj.State)
.OnJump(x =>
{
obj.State = x.Fsm.Current;
Console.WriteLine($"State changed to {obj.State} from {x.PrevState}");
})
.State(State.S1)
.On(Action.A1).Execute(x => { /* some operations */ return obj.Title; })
.On(Action.A2).JumpTo(State.S2)
.State(State.S2)
.On(Action.A3).Enable(x => /* some conditions */ true).JumpTo(State.S3)
.State(State.S3)
.OnEnter(x => Console.WriteLine($"Enter to final state"))
.Build();
}
}
```

```C#
var sampleObject = new SampleObject { Title = "Test", State = State.S1 };
var workflowBuilder = new SampleWorkflow();
var workflow = workflowBuilder.Build(sampleObject);

workflow.Trigger(Action.A2);
workflow.Trigger(Action.A3);

// Console output:
// State change to S2 from S1
// State change to S3 from S2
// Enter to final state
```

### Example #2 - JSON based workflow declaration
```json
{
"start": "_obj.State",
"onJump": "_obj.State = _args.Fsm.Current; Console.WriteLine($\"State changed to {_obj.State} from {_args.PrevState}\")",

"states": {
"S1": {
"events": {
"A1": { "execute": "/* some operations */ return _obj.Title" },
"A2": { "jumpTo": "ConsoleApp.State.S2" }
}
},
"S2": {
"events": {
"A3": { "jumpTo": "ConsoleApp.State.S3" }
}
},
"S3": {
"onEnter": "Console.WriteLine(\"Enter to final state\")"
}
}
}
```

```C#
var sampleObject = new SampleObject { Title = "Test", State = State.S1 };
var workflowBuilder = new FsmWorkflowJson(File.ReadAllText(@"SampleWorkflow.json"));
var workflow = workflowBuilder.Build(sampleObject);

workflow.Trigger(Action.A2);
workflow.Trigger(Action.A3);

// Console output:
// State change to S2 from S1
// State change to S3 from S2
// Enter to final state
```