diff --git a/internal/config/config.go b/internal/config/config.go index 0088ec5..bd96689 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,8 +1,67 @@ package config +import ( + "encoding/json" + "errors" + "fmt" + "os" + "path/filepath" +) + +const ( + configDirPath = "data" + configFile = "data.json" +) + type Config interface { Install() error Update() error Clean() error Compare() error } + +type configApps struct { + Apps map[string]App `json:"apps"` +} + +// Read from file +type App struct { + Paths []Path `json:"paths"` +} + +type Path struct { + Internal string `json:"internal"` + External string `json:"external"` +} + +// LoadConfig return config, configDemo +func LoadConfig(path string) (*configReal, *configDemo, error) { + configPath := getConfigPath(path) + bytes, err := os.ReadFile(configPath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, nil, fmt.Errorf("file not exist %s: %w", configPath, err) + } + + return nil, nil, fmt.Errorf("failed to read file%s: %w", configPath, err) + } + + var cfgApps configApps + if err = json.Unmarshal(bytes, &cfgApps); err != nil { + return nil, nil, fmt.Errorf("failed to unmarshal: %w", err) + } + + cfgReal := configReal{ + configApps: cfgApps, + } + + cfgDemo := configDemo{ + configApps: cfgApps, + } + + return &cfgReal, &cfgDemo, nil +} + +func getConfigPath(path string) string { + return filepath.Join(path, configDirPath, configFile) +} diff --git a/internal/config/config_demo.go b/internal/config/config_demo.go index 30c1989..4a24a29 100644 --- a/internal/config/config_demo.go +++ b/internal/config/config_demo.go @@ -8,8 +8,8 @@ type configDemo struct { var _ Config = (*configDemo)(nil) -func (cd *configDemo) Install() error { - for _, app := range cd.Apps { +func (c *configDemo) Install() error { + for _, app := range c.Apps { for _, p := range app.Paths { fmt.Printf("Replace %s -> %s\n", p.Internal, p.External) } @@ -18,8 +18,8 @@ func (cd *configDemo) Install() error { return nil } -func (cd *configDemo) Update() error { - for _, app := range cd.Apps { +func (c *configDemo) Update() error { + for _, app := range c.Apps { for _, p := range app.Paths { fmt.Printf("Replace %s -> %s\n", p.External, p.Internal) } @@ -28,8 +28,8 @@ func (cd *configDemo) Update() error { return nil } -func (cd *configDemo) Clean() error { - unusedDirs, err := getUnusedDirs(cd.Apps) +func (c *configDemo) Clean() error { + unusedDirs, err := getUnusedDirs(c.Apps) if err != nil { return err } @@ -41,6 +41,6 @@ func (cd *configDemo) Clean() error { return nil } -func (cd *configDemo) Compare() error { +func (c *configDemo) Compare() error { return nil } diff --git a/internal/config/config_real.go b/internal/config/config_real.go index 6fc9c2a..20ebf8c 100644 --- a/internal/config/config_real.go +++ b/internal/config/config_real.go @@ -1,8 +1,6 @@ package config import ( - "encoding/json" - "errors" "fmt" "os" "path/filepath" @@ -10,61 +8,14 @@ import ( "github.com/haunt98/copy-go" ) -const ( - configDirPath = "data" - configFile = "data.json" -) - -type config struct { +type configReal struct { configApps } -var _ Config = (*config)(nil) - -type configApps struct { - Apps map[string]App `json:"apps"` -} - -// Read from file -type App struct { - Paths []Path `json:"paths"` -} - -type Path struct { - Internal string `json:"internal"` - External string `json:"external"` -} - -// LoadConfig return config, configDemo -func LoadConfig(path string) (*config, *configDemo, error) { - configPath := getConfigPath(path) - bytes, err := os.ReadFile(configPath) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return nil, nil, fmt.Errorf("file not exist %s: %w", configPath, err) - } - - return nil, nil, fmt.Errorf("failed to read file%s: %w", configPath, err) - } - - var cfgApps configApps - if err = json.Unmarshal(bytes, &cfgApps); err != nil { - return nil, nil, fmt.Errorf("failed to unmarshal: %w", err) - } - - cfg := config{ - configApps: cfgApps, - } - - cfgDemo := configDemo{ - configApps: cfgApps, - } - - return &cfg, &cfgDemo, nil -} +var _ Config = (*configReal)(nil) // Install internal -> external -func (c *config) Install() error { +func (c *configReal) Install() error { for _, app := range c.Apps { for _, p := range app.Paths { if err := copy.Replace(p.Internal, p.External); err != nil { @@ -77,7 +28,7 @@ func (c *config) Install() error { } // Update external -> internal -func (c *config) Update() error { +func (c *configReal) Update() error { for _, app := range c.Apps { for _, p := range app.Paths { if err := copy.Replace(p.External, p.Internal); err != nil { @@ -90,7 +41,7 @@ func (c *config) Update() error { } // Clean remove unused config inside config dir -func (c *config) Clean() error { +func (c *configReal) Clean() error { unusedDirs, err := getUnusedDirs(c.Apps) if err != nil { return err @@ -107,7 +58,7 @@ func (c *config) Clean() error { return nil } -func (c *config) Compare() error { +func (c *configReal) Compare() error { for _, app := range c.Apps { for _, p := range app.Paths { if err := copy.Compare(p.Internal, p.External); err != nil { @@ -119,10 +70,6 @@ func (c *config) Compare() error { return nil } -func getConfigPath(path string) string { - return filepath.Join(path, configDirPath, configFile) -} - func getUnusedDirs(apps map[string]App) (map[string]struct{}, error) { files, err := os.ReadDir(configDirPath) if err != nil {