From 39a8d9e13ecb9619418bd15dba5ef3ecf4e2d9f9 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Wed, 20 Nov 2024 10:31:25 -0600 Subject: config files are cool! --- config.go | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'config.go') diff --git a/config.go b/config.go index 8cdc9ae..ed13e8c 100644 --- a/config.go +++ b/config.go @@ -9,7 +9,6 @@ import ( "path/filepath" "go.wit.com/log" - "google.golang.org/protobuf/proto" ) // writes out the cluster information it seperate files @@ -29,18 +28,50 @@ func (m *Repos) ConfigSave() error { } func (m *Repos) ConfigLoad() error { + var data []byte + var err error if m == nil { return errors.New("It's not safe to run ConfigLoad() on a nil ?") } - if data, err := loadFile("forge.pb"); err == nil { - if err = proto.Unmarshal(data, m); err != nil { + if data, err = loadFile("forge.pb"); err != nil { + // something went wrong loading the file + return err + } + + if data != nil { + // this means the forge.pb file exists and was read + if len(data) == 0 { + // todo: error out if the file is empty? + // try forge.text & forge.json? + } + if err = m.Unmarshal(data); err != nil { log.Warn("broken forge.pb config file") return err } - } else { + return nil + } + + // forge.db doesn't exist. try forge.text + // this lets the user hand edit the config + if data, err = loadFile("forge.text"); err != nil { + // something went wrong loading the file return err } + + if data != nil { + // this means the forge.text file exists and was read + if len(data) == 0 { + // todo: error out if the file is empty? + } + if err = m.UnmarshalTEXT(data); err != nil { + log.Warn("broken forge.text config file") + return err + } + return nil + } + + // first time user. make a template config file return nil } @@ -49,6 +80,12 @@ func loadFile(filename string) ([]byte, error) { p := filepath.Join(homeDir, ".config/forge") fullname := filepath.Join(p, filename) data, err := os.ReadFile(fullname) + if errors.Is(err, os.ErrNotExist) { + // if file does not exist, just return nil. this + // will cause ConfigLoad() to try the next config file like "forge.text" + // because the user might want to edit the .config by hand + return nil, nil + } if err != nil { // log.Info("open config file :", err) return nil, err -- cgit v1.2.3