summaryrefslogtreecommitdiff
path: root/internal/fsm.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-06-17 14:00:40 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-20 20:31:23 +0200
commit7af07c596166bf93b79a9d0816b1950dde360fb9 (patch)
tree08b5374c34d6c33b3c596ed981bfb069cca37ade /internal/fsm.go
parent6dc7b64f634f6dcbeedea24c741382366a3c7b8c (diff)
Server: Implement function for checking renewal button visibility
Diffstat (limited to 'internal/fsm.go')
-rw-r--r--internal/fsm.go227
1 files changed, 0 insertions, 227 deletions
diff --git a/internal/fsm.go b/internal/fsm.go
deleted file mode 100644
index 4df24a0..0000000
--- a/internal/fsm.go
+++ /dev/null
@@ -1,227 +0,0 @@
-package internal
-
-import (
- "fmt"
- "os"
- "os/exec"
- "path"
- "sort"
-)
-
-type (
- FSMStateID int8
- FSMStateIDSlice []FSMStateID
-)
-
-func (v FSMStateIDSlice) Len() int {
- return len(v)
-}
-
-func (v FSMStateIDSlice) Less(i, j int) bool {
- return v[i] < v[j]
-}
-
-func (v FSMStateIDSlice) Swap(i, j int) {
- v[i], v[j] = v[j], v[i]
-}
-
-const (
- // Deregistered means the app is not registered with the wrapper
- DEREGISTERED FSMStateID = iota
-
- // No Server means the user has not chosen a server yet
- NO_SERVER
-
- // Chosen Server means the user has chosen a server to connect to
- CHOSEN_SERVER
-
- // OAuth Started means the OAuth process has started
- OAUTH_STARTED
-
- // Authorized means the OAuth process has finished and the user is now authorized with the server
- AUTHORIZED
-
- // Requested config means the user has requested a config for connecting
- REQUEST_CONFIG
-
- // Has config means the user has gotten a config
- HAS_CONFIG
-
- // Ask profile means the go code is asking for a profile selection from the ui
- ASK_PROFILE
-
- // Connected means the user has been connected to the server
- CONNECTED
-)
-
-func (s FSMStateID) String() string {
- switch s {
- case DEREGISTERED:
- return "Deregistered"
- case NO_SERVER:
- return "No_Server"
- case CHOSEN_SERVER:
- return "Chosen_Server"
- case OAUTH_STARTED:
- return "OAuth_Started"
- case HAS_CONFIG:
- return "Has_Config"
- case REQUEST_CONFIG:
- return "Request_Config"
- case ASK_PROFILE:
- return "Ask_Profile"
- case AUTHORIZED:
- return "Authorized"
- case CONNECTED:
- return "Connected"
- default:
- panic("unknown conversion of state to string")
- }
-}
-
-type FSMTransition struct {
- To FSMStateID
- Description string
-}
-
-type (
- FSMTransitions []FSMTransition
- FSMStates map[FSMStateID]FSMTransitions
-)
-
-type FSM struct {
- States FSMStates
- Current FSMStateID
-
- // Info to be passed from the parent state
- Name string
- StateCallback func(string, string, string)
- Logger *FileLogger
- Directory string
- Debug bool
-}
-
-func (fsm *FSM) Init(name string, callback func(string, string, string), logger *FileLogger, directory string, debug bool) {
- fsm.States = FSMStates{
- DEREGISTERED: {{NO_SERVER, "Client registers"}},
- NO_SERVER: {{CHOSEN_SERVER, "User chooses a server"}},
- CHOSEN_SERVER: {{AUTHORIZED, "Found tokens in config"}, {OAUTH_STARTED, "No tokens found in config"}},
- OAUTH_STARTED: {{AUTHORIZED, "User authorizes with browser"}, {NO_SERVER, "Cancel or Error"}},
- AUTHORIZED: {{OAUTH_STARTED, "Re-authorize with OAuth"}, {REQUEST_CONFIG, "Client requests a config"}},
- REQUEST_CONFIG: {{ASK_PROFILE, "Multiple profiles found and no profile chosen"}, {HAS_CONFIG, "Only one profile or profile already chosen"}, {NO_SERVER, "Cancel or Error"}, {OAUTH_STARTED, "Re-authorize"}},
- ASK_PROFILE: {{HAS_CONFIG, "User chooses profile"}, {NO_SERVER, "Done but no profile selected"}},
- HAS_CONFIG: {{CONNECTED, "OS reports connected"}, {REQUEST_CONFIG, "User chooses a new profile"}, {NO_SERVER, "User wants to choose a new server"}},
- CONNECTED: {{HAS_CONFIG, "OS reports disconnected"}},
- }
- fsm.Current = DEREGISTERED
- fsm.Name = name
- fsm.StateCallback = callback
- fsm.Logger = logger
- fsm.Directory = directory
- fsm.Debug = debug
-}
-
-func (fsm *FSM) InState(check FSMStateID) bool {
- return check == fsm.Current
-}
-
-func (fsm *FSM) HasTransition(check FSMStateID) bool {
- for _, transition_state := range fsm.States[fsm.Current] {
- if transition_state.To == check {
- return true
- }
- }
-
- return false
-}
-
-func (fsm *FSM) getGraphFilename(extension string) string {
- debugPath := path.Join(fsm.Directory, fsm.Name)
- return fmt.Sprintf("%s%s", debugPath, extension)
-}
-
-func (fsm *FSM) writeGraph() {
- graph := fsm.GenerateGraph()
- graphFile := fsm.getGraphFilename(".graph")
- graphImgFile := fsm.getGraphFilename(".png")
- f, err := os.Create(graphFile)
- if err != nil {
- fsm.Logger.Log(LOG_INFO, fmt.Sprintf("Failed to write debug fsm graph with error %v", err))
- return
- }
-
- f.WriteString(graph)
- f.Close()
- cmd := exec.Command("mmdc", "-i", graphFile, "-o", graphImgFile)
-
- cmd.Start()
-}
-
-func (fsm *FSM) GoTransitionWithData(newState FSMStateID, data string, background bool) bool {
- ok := fsm.HasTransition(newState)
-
- if ok {
- oldState := fsm.Current
- fsm.Current = newState
- if fsm.Debug {
- fsm.writeGraph()
- }
-
- fsm.Logger.Log(LOG_INFO, fmt.Sprintf("State: %s -> State: %s with data %s\n", oldState.String(), newState.String(), data))
-
- if background {
- go fsm.StateCallback(oldState.String(), newState.String(), data)
- } else {
- fsm.StateCallback(oldState.String(), newState.String(), data)
- }
- }
-
- return ok
-}
-
-func (fsm *FSM) GoTransition(newState FSMStateID) bool {
- return fsm.GoTransitionWithData(newState, "", false)
-}
-
-func (fsm *FSM) generateMermaidGraph() string {
- graph := "graph TD\n"
- sorted_fsm := make(FSMStateIDSlice, 0, len(fsm.States))
- for state_id := range fsm.States {
- sorted_fsm = append(sorted_fsm, state_id)
- }
- sort.Sort(sorted_fsm)
- for _, state := range sorted_fsm {
- transitions := fsm.States[state]
- for _, transition := range transitions {
- if state == fsm.Current {
- graph += "\nstyle " + state.String() + " fill:cyan\n"
- } else {
- graph += "\nstyle " + state.String() + " fill:white\n"
- }
- graph += state.String() + "(" + state.String() + ") " + "-->|" + transition.Description + "| " + transition.To.String() + "\n"
- }
- }
- return graph
-}
-
-func (fsm *FSM) GenerateGraph() string {
- return fsm.generateMermaidGraph()
-}
-
-type FSMWrongStateTransitionError struct {
- Got FSMStateID
- Want FSMStateID
-}
-
-func (e *FSMWrongStateTransitionError) Error() string {
- return fmt.Sprintf("wrong FSM state, got: %s, want a state with a transition to: %s", e.Got.String(), e.Want.String())
-}
-
-type FSMWrongStateError struct {
- Got FSMStateID
- Want FSMStateID
-}
-
-func (e *FSMWrongStateError) Error() string {
- return fmt.Sprintf("wrong FSM state, got: %s, want: %s", e.Got.String(), e.Want.String())
-}