Skip to content

Commit

Permalink
bind cmdutil
Browse files Browse the repository at this point in the history
  • Loading branch information
kyoh86 committed Nov 13, 2023
1 parent 5e4c6f7 commit a473bee
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 75 deletions.
3 changes: 2 additions & 1 deletion cmd/gogh/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/apex/log/handlers/cli"
"github.com/apex/log/handlers/level"
"github.com/apex/log/handlers/multi"
"github.com/kyoh86/gogh/v2/cmdutil"
"github.com/spf13/cobra"
)

Expand All @@ -19,7 +20,7 @@ var (
)

var facadeCommand = &cobra.Command{
Use: appName,
Use: cmdutil.AppName,
Short: "GO GitHub project manager",
Version: fmt.Sprintf("%s-%s (%s)", version, commit, date),
}
Expand Down
83 changes: 9 additions & 74 deletions cmd/gogh/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ import (
"path/filepath"
"sync"

"github.com/goccy/go-yaml"
"github.com/kyoh86/gogh/v2/cmdutil"
"github.com/spf13/cobra"
)

const appName = "gogh"

var setupOnce sync.Once

func setup() {
Expand Down Expand Up @@ -42,77 +40,14 @@ func setupCore() (err error) {
return nil
}

func loadYAML(path string, obj interface{}) error {
file, err := os.Open(path)
switch {
case err == nil:
// noop
case os.IsNotExist(err):
return nil
default:
return err
}
defer file.Close()
dec := yaml.NewDecoder(file)
return dec.Decode(obj)
}

func saveYAML(path string, obj interface{}) error {
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
return err
}
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return err
}
defer file.Close()
enc := yaml.NewEncoder(file)
return enc.Encode(obj)
}

type appFileHandler struct {
dir func() (string, error)
basename string
}

func (h appFileHandler) appFilePath() (string, error) {
dir, err := h.dir()
if err != nil {
return "", fmt.Errorf("search app file dir for %s: %w", h.basename, err)
}
return filepath.Join(dir, appName, h.basename), nil
}

func (h appFileHandler) load(output interface{}) (string, error) {
path, err := h.appFilePath()
if err != nil {
return "", err
}
if err := loadYAML(path, output); err != nil {
return "", fmt.Errorf("load %s: %w", h.basename, err)
}
return path, nil
}

func (h appFileHandler) save(input interface{}) error {
path, err := h.appFilePath()
if err != nil {
return err
}
if err := saveYAML(path, input); err != nil {
return fmt.Errorf("save %s: %w", h.basename, err)
}
return nil
}

var (
configFileHandler = appFileHandler{dir: os.UserConfigDir, basename: "config.yaml"}
tokensFileHandler = appFileHandler{dir: os.UserCacheDir, basename: "tokens.yaml"}
defaultFlagFileHandler = appFileHandler{dir: os.UserConfigDir, basename: "flag.yaml"}
configFileHandler = cmdutil.AppFile{Dir: os.UserConfigDir, Basename: "config.yaml"}
tokensFileHandler = cmdutil.AppFile{Dir: os.UserCacheDir, Basename: "tokens.yaml"}
defaultFlagFileHandler = cmdutil.AppFile{Dir: os.UserConfigDir, Basename: "flag.yaml"}
)

func loadConfig() (string, error) {
path, err := configFileHandler.load(&config)
path, err := configFileHandler.Load(&config)
if err != nil {
return "", err
}
Expand All @@ -134,17 +69,17 @@ func loadConfig() (string, error) {
}

func saveConfig() error {
return configFileHandler.save(config)
return configFileHandler.Save(config)
}

func loadTokens() (string, error) {
return tokensFileHandler.load(&tokens)
return tokensFileHandler.Load(&tokens)
}

func saveTokens() error {
return tokensFileHandler.save(tokens)
return tokensFileHandler.Save(tokens)
}

func loadDefaultFlag() (string, error) {
return defaultFlagFileHandler.load(&defaultFlag)
return defaultFlagFileHandler.Load(&defaultFlag)
}
74 changes: 74 additions & 0 deletions cmdutil/app_file.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package cmdutil

import (
"fmt"
"os"
"path/filepath"

"github.com/goccy/go-yaml"
)

const AppName = "gogh"

func loadYAML(path string, obj interface{}) error {
file, err := os.Open(path)
switch {
case err == nil:
// noop
case os.IsNotExist(err):
return nil
default:
return err
}
defer file.Close()
dec := yaml.NewDecoder(file)
return dec.Decode(obj)
}

func saveYAML(path string, obj interface{}) error {
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
return err
}
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return err
}
defer file.Close()
enc := yaml.NewEncoder(file)
return enc.Encode(obj)
}

type AppFile struct {
Dir func() (string, error)
Basename string
}

func (h AppFile) appFilePath() (string, error) {
dir, err := h.Dir()
if err != nil {
return "", fmt.Errorf("search app file dir for %s: %w", h.Basename, err)
}
return filepath.Join(dir, AppName, h.Basename), nil
}

func (h AppFile) Load(output interface{}) (string, error) {
path, err := h.appFilePath()
if err != nil {
return "", err
}
if err := loadYAML(path, output); err != nil {
return "", fmt.Errorf("load %s: %w", h.Basename, err)
}
return path, nil
}

func (h AppFile) Save(input interface{}) error {
path, err := h.appFilePath()
if err != nil {
return err
}
if err := saveYAML(path, input); err != nil {
return fmt.Errorf("save %s: %w", h.Basename, err)
}
return nil
}

0 comments on commit a473bee

Please sign in to comment.