// Copyright 2024 Matthew Rich . All rights reserved. package data import ( "gitea.rosskeen.house/rosskeen.house/machine" ) func StorageMachine(sub machine.Subscriber) machine.Stater { // start_destroy -> absent -> start_create -> present -> start_destroy stater := machine.New("unknown") stater.AddStates("initialized", "unkonwn", "absent", "start_create", "present", "start_delete", "start_read", "start_update") stater.AddTransition("construct", machine.States("unknown"), "initialized") stater.AddTransition("create", machine.States("unknown", "initialized", "absent"), "start_create") if e := stater.AddSubscription("create", sub); e != nil { return nil } stater.AddTransition("created", machine.States("start_create"), "present") if e := stater.AddSubscription("created", sub); e != nil { return nil } stater.AddTransition("exists", machine.States("unknown", "initialized", "absent"), "present") if e := stater.AddSubscription("exists", sub); e != nil { return nil } stater.AddTransition("notexists", machine.States("*"), "absent") if e := stater.AddSubscription("notexists", sub); e != nil { return nil } stater.AddTransition("read", machine.States("*"), "start_read") if e := stater.AddSubscription("read", sub); e != nil { return nil } stater.AddTransition("state_read", machine.States("start_read"), "present") stater.AddTransition("update", machine.States("*"), "start_update") if e := stater.AddSubscription("update", sub); e != nil { return nil } stater.AddTransition("updated", machine.States("start_update"), "present") stater.AddTransition("delete", machine.States("*"), "start_delete") if e := stater.AddSubscription("delete", sub); e != nil { return nil } stater.AddTransition("deleted", machine.States("start_delete"), "absent") if e := stater.AddSubscription("deleted", sub); e != nil { return nil } return stater }