package main import ( "log" "m.cluseau.fr/go/watchable" "novit.tech/direktil/pkg/localconfig" ) type PublicState struct { UIHash string Store struct { New bool Open bool } } var wPublicState = watchable.New[PublicState]() type State struct { HasConfig bool Clusters []ClusterState Hosts []HostState Config *localconfig.Config Downloads map[string]DownloadSpec } type ClusterState struct { Name string Addons bool // TODO CAs // TODO passwords // TODO tokens } type HostState struct { Name string Cluster string IPs []string } var wState = watchable.New[State]() func init() { wState.Set(State{Downloads: map[string]DownloadSpec{}}) } func updateState() { log.Print("updating state") cfg, err := readConfig() if err != nil { wState.Change(func(v *State) { v.HasConfig = false; v.Config = nil }) return } if secStore.IsNew() || !secStore.Unlocked() { wState.Change(func(v *State) { v.HasConfig = false; v.Config = nil }) return } // remove heavy data clusters := make([]ClusterState, 0, len(cfg.Clusters)) for _, cluster := range cfg.Clusters { c := ClusterState{ Name: cluster.Name, Addons: len(cluster.Addons) != 0, } clusters = append(clusters, c) } hosts := make([]HostState, 0, len(cfg.Hosts)) for _, host := range cfg.Hosts { h := HostState{ Name: host.Name, Cluster: host.ClusterName, IPs: host.IPs, } hosts = append(hosts, h) } // done wState.Change(func(v *State) { v.HasConfig = true //v.Config = cfg v.Clusters = clusters v.Hosts = hosts }) }