{"id":23740224,"url":"https://github.com/mustaddon/fsmworkflow","last_synced_at":"2025-09-04T15:32:10.626Z","repository":{"id":38009330,"uuid":"181529102","full_name":"mustaddon/FsmWorkflow","owner":"mustaddon","description":"Finite-state machine (FSM) based workflow","archived":false,"fork":false,"pushed_at":"2022-06-23T07:22:56.000Z","size":23,"stargazers_count":5,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-04T07:48:15.367Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mustaddon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-15T16:51:13.000Z","updated_at":"2022-06-23T06:41:08.000Z","dependencies_parsed_at":"2022-09-09T16:22:00.770Z","dependency_job_id":null,"html_url":"https://github.com/mustaddon/FsmWorkflow","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustaddon%2FFsmWorkflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustaddon%2FFsmWorkflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustaddon%2FFsmWorkflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustaddon%2FFsmWorkflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mustaddon","download_url":"https://codeload.github.com/mustaddon/FsmWorkflow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231970943,"owners_count":18453930,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-31T09:47:30.218Z","updated_at":"2024-12-31T09:47:30.950Z","avatar_url":"https://github.com/mustaddon.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FsmWorkflow [![NuGet version](https://badge.fury.io/nu/RandomSolutions.FsmWorkflow.svg)](http://badge.fury.io/nu/RandomSolutions.FsmWorkflow)\nFinite-state machine (FSM) based workflow\n\n### Example #1 - Code based workflow declaration\n```C#\npublic enum State { S1, S2, S3 }\npublic enum Action { A1, A2, A3 }\n\npublic class SampleObject\n{\n    public string Title { get; set; }\n    public State State { get; set; }\n}\n\npublic class SampleWorkflow : IFsmWorkflowBuilder\u003cSampleObject, State, Action\u003e\n{\n    public IStateMachine\u003cState, Action\u003e Build(SampleObject obj)\n    {\n        return new FsmBuilder\u003cState, Action\u003e(obj.State)\n            .OnJump(x =\u003e\n            {\n                obj.State = x.Fsm.Current;\n                Console.WriteLine($\"State changed to {obj.State} from {x.PrevState}\");\n            })\n            .State(State.S1)\n                .On(Action.A1).Execute(x =\u003e { /* some operations */ return obj.Title; })\n                .On(Action.A2).JumpTo(State.S2)\n            .State(State.S2)\n                .On(Action.A3).Enable(x =\u003e /* some conditions */ true).JumpTo(State.S3)\n            .State(State.S3)\n                .OnEnter(x =\u003e Console.WriteLine($\"Enter to final state\"))\n            .Build();\n    }\n}\n```\n\n```C#\nvar sampleObject = new SampleObject { Title = \"Test\", State = State.S1  };\nvar workflowBuilder = new SampleWorkflow();\nvar workflow = workflowBuilder.Build(sampleObject);\n\nworkflow.Trigger(Action.A2);\nworkflow.Trigger(Action.A3);\n\n\n// Console output:\n// State change to S2 from S1\n// State change to S3 from S2\n// Enter to final state\n```\n\n\n### Example #2 - JSON based workflow declaration\n```json\n{\n  \"start\": \"_obj.State\",\n  \"onJump\": \"_obj.State = _args.Fsm.Current; Console.WriteLine($\\\"State changed to {_obj.State} from {_args.PrevState}\\\")\",\n\n  \"states\": {\n    \"S1\": {\n      \"events\": {\n        \"A1\": { \"execute\": \"/* some operations */ return _obj.Title\" },\n        \"A2\": { \"jumpTo\": \"ConsoleApp.State.S2\" }\n      }\n    },\n    \"S2\": {\n      \"events\": {\n        \"A3\": { \"jumpTo\": \"ConsoleApp.State.S3\" }\n      }\n    },\n    \"S3\": {\n      \"onEnter\": \"Console.WriteLine(\\\"Enter to final state\\\")\"\n    }\n  }\n}\n```\n\n```C#\nvar sampleObject = new SampleObject { Title = \"Test\", State = State.S1  };\nvar workflowBuilder = new FsmWorkflowJson\u003cSampleObject,State,Action\u003e(File.ReadAllText(@\"SampleWorkflow.json\"));\nvar workflow = workflowBuilder.Build(sampleObject);\n\nworkflow.Trigger(Action.A2);\nworkflow.Trigger(Action.A3);\n\n\n// Console output:\n// State change to S2 from S1\n// State change to S3 from S2\n// Enter to final state\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmustaddon%2Ffsmworkflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmustaddon%2Ffsmworkflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmustaddon%2Ffsmworkflow/lists"}