{"id":13393361,"url":"https://github.com/looplab/fsm","last_synced_at":"2025-05-12T13:15:48.434Z","repository":{"id":10184509,"uuid":"12272337","full_name":"looplab/fsm","owner":"looplab","description":"Finite State Machine for Go","archived":false,"fork":false,"pushed_at":"2025-05-07T12:11:11.000Z","size":74,"stargazers_count":3024,"open_issues_count":28,"forks_count":320,"subscribers_count":51,"default_branch":"main","last_synced_at":"2025-05-07T13:25:12.857Z","etag":null,"topics":["finite-state-machine","fsm","go"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/looplab.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-08-21T14:30:43.000Z","updated_at":"2025-05-07T13:06:56.000Z","dependencies_parsed_at":"2024-10-28T18:47:17.510Z","dependency_job_id":null,"html_url":"https://github.com/looplab/fsm","commit_stats":{"total_commits":65,"total_committers":25,"mean_commits":2.6,"dds":0.5538461538461539,"last_synced_commit":"e668a855b71a8311a3f1862326bcbbf0223dd35b"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/looplab%2Ffsm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/looplab%2Ffsm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/looplab%2Ffsm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/looplab%2Ffsm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/looplab","download_url":"https://codeload.github.com/looplab/fsm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253745196,"owners_count":21957319,"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":["finite-state-machine","fsm","go"],"created_at":"2024-07-30T17:00:51.153Z","updated_at":"2025-05-12T13:15:48.388Z","avatar_url":"https://github.com/looplab.png","language":"Go","funding_links":[],"categories":["Go","开源类库","Data structures","Open source library","Libraries","Repositories"],"sub_categories":["算法","Algorithm","Go"],"readme":"[![PkgGoDev](https://pkg.go.dev/badge/github.com/looplab/fsm)](https://pkg.go.dev/github.com/looplab/fsm)\n![Bulid Status](https://github.com/looplab/fsm/actions/workflows/main.yml/badge.svg)\n[![Coverage Status](https://img.shields.io/coveralls/looplab/fsm.svg)](https://coveralls.io/r/looplab/fsm)\n[![Go Report Card](https://goreportcard.com/badge/looplab/fsm)](https://goreportcard.com/report/looplab/fsm)\n\n# FSM for Go\n\nFSM is a finite state machine for Go.\n\nIt is heavily based on two FSM implementations:\n\n- Javascript Finite State Machine, https://github.com/jakesgordon/javascript-state-machine\n\n- Fysom for Python, https://github.com/oxplot/fysom (forked at https://github.com/mriehl/fysom)\n\nFor API docs and examples see http://godoc.org/github.com/looplab/fsm\n\n# Basic Example\n\nFrom examples/simple.go:\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com/looplab/fsm\"\n)\n\nfunc main() {\n    fsm := fsm.NewFSM(\n        \"closed\",\n        fsm.Events{\n            {Name: \"open\", Src: []string{\"closed\"}, Dst: \"open\"},\n            {Name: \"close\", Src: []string{\"open\"}, Dst: \"closed\"},\n        },\n        fsm.Callbacks{},\n    )\n\n    fmt.Println(fsm.Current())\n\n    err := fsm.Event(context.Background(), \"open\")\n    if err != nil {\n        fmt.Println(err)\n    }\n\n    fmt.Println(fsm.Current())\n\n    err = fsm.Event(context.Background(), \"close\")\n    if err != nil {\n        fmt.Println(err)\n    }\n\n    fmt.Println(fsm.Current())\n}\n```\n\n# Usage as a struct field\n\nFrom examples/struct.go:\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com/looplab/fsm\"\n)\n\ntype Door struct {\n    To  string\n    FSM *fsm.FSM\n}\n\nfunc NewDoor(to string) *Door {\n    d := \u0026Door{\n        To: to,\n    }\n\n    d.FSM = fsm.NewFSM(\n        \"closed\",\n        fsm.Events{\n            {Name: \"open\", Src: []string{\"closed\"}, Dst: \"open\"},\n            {Name: \"close\", Src: []string{\"open\"}, Dst: \"closed\"},\n        },\n        fsm.Callbacks{\n            \"enter_state\": func(_ context.Context, e *fsm.Event) { d.enterState(e) },\n        },\n    )\n\n    return d\n}\n\nfunc (d *Door) enterState(e *fsm.Event) {\n    fmt.Printf(\"The door to %s is %s\\n\", d.To, e.Dst)\n}\n\nfunc main() {\n    door := NewDoor(\"heaven\")\n\n    err := door.FSM.Event(context.Background(), \"open\")\n    if err != nil {\n        fmt.Println(err)\n    }\n\n    err = door.FSM.Event(context.Background(), \"close\")\n    if err != nil {\n        fmt.Println(err)\n    }\n}\n```\n\n# License\n\nFSM is licensed under Apache License 2.0\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flooplab%2Ffsm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flooplab%2Ffsm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flooplab%2Ffsm/lists"}