From a73aa114520fc10be303a2f071cbb1c1d859bfbb Mon Sep 17 00:00:00 2001 From: ben-ha <26024480+ben-ha@users.noreply.github.com> Date: Sun, 10 Mar 2024 12:17:38 +0000 Subject: [PATCH] wip --- main.go | 15 ++++++++++++--- state/state.go | 1 + state/statemanager.go | 29 +++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index b0d00b4..2a030e0 100644 --- a/main.go +++ b/main.go @@ -7,11 +7,12 @@ import ( "sync" "github.com/ben-ha/jcp/logic" + "github.com/ben-ha/jcp/state" "github.com/ben-ha/jcp/tui" tea "github.com/charmbracelet/bubbletea" ) -func updaterFunc(jcp logic.Jcp, ui *tea.Program) { +func updaterFunc(jcp logic.Jcp, ui *tea.Program, state *state.JcpState) { for { update, more := <-jcp.ProgressChannel if !more { @@ -26,6 +27,7 @@ func updaterFunc(jcp logic.Jcp, ui *tea.Program) { panic(fmt.Sprintf("An error occurred: %v", update.JcpError.Error())) } + state.Update(update) ui.Send(tui.UITransferMsg{Progress: update.Progress}) } @@ -43,6 +45,13 @@ func main() { src := os.Args[1] dst := os.Args[2] + state, err := state.InitializeState() + if err != nil { + panic(fmt.Sprintf("State: %v", err)) + } + + defer state.SaveState() + jcp := logic.MakeJcp(10) ui := tea.NewProgram(tui.UIModel{}) @@ -51,9 +60,9 @@ func main() { go StartUI(ui, &uiComplete) - go updaterFunc(jcp, ui) + go updaterFunc(jcp, ui, state) - err := jcp.StartCopy(src, dst) + err = jcp.StartCopy(src, dst) if err != nil { panic(fmt.Sprintf("Error: %v", err)) } diff --git a/state/state.go b/state/state.go index 8738bc9..a7d9546 100644 --- a/state/state.go +++ b/state/state.go @@ -11,6 +11,7 @@ type CopyDestinationKey = string type JcpState struct { CopyStates map[CopySourceKey](map[CopyDestinationKey]JcpCopyState) + StatePath string } type CopierType int diff --git a/state/statemanager.go b/state/statemanager.go index bff20d9..1f5b856 100644 --- a/state/statemanager.go +++ b/state/statemanager.go @@ -3,6 +3,7 @@ package state import ( "encoding/json" "os" + "path" "sync" "time" @@ -13,7 +14,26 @@ var stateManagerMutex sync.Mutex const ValidStateWindowInDays = 1 -func LoadState(fileName string) *JcpState { +const JcpStateDirectoryName = "jcp" +const JcpStateFileName = "state.json" + +func InitializeState() (*JcpState, error) { + cacheDir, err := os.UserCacheDir() + if err != nil { + return nil, err + } + + jcpDir := path.Join(cacheDir, JcpStateDirectoryName) + + err = os.Mkdir(jcpDir, os.ModePerm) + if !os.IsExist(err) { + return nil, err + } + + return loadState(path.Join(jcpDir, JcpStateFileName)), nil +} + +func loadState(fileName string) *JcpState { data, err := os.ReadFile(fileName) loadedState := &JcpState{} if err == nil { @@ -21,11 +41,16 @@ func LoadState(fileName string) *JcpState { } loadedState.Clean() + loadedState.StatePath = fileName return loadedState } -func (copierState *JcpState) Save(fileName string) { +func (copierState *JcpState) SaveState() { + copierState.saveState(copierState.StatePath) +} + +func (copierState *JcpState) saveState(fileName string) { serialized, err := json.Marshal(copierState) if err == nil {