diff --git a/cmd/zit/main.go b/cmd/zit/main.go index b1559b4..2183da3 100644 --- a/cmd/zit/main.go +++ b/cmd/zit/main.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "zit/internal/config" "zit/internal/doctor" "zit/internal/identity" "zit/internal/version" @@ -20,6 +21,7 @@ func main() { version.VersionCmd(AppVersion), doctor.DoctorCmd, identity.SetCmd, + config.ConfigCmd, }, } diff --git a/internal/config/config.go b/internal/config/config.go index 2b94a8b..ddf70a0 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -19,6 +19,7 @@ func (err *ErrConfigNotFound) Error() string { if err.EnvVar { envVar = " defined in " + EnvVarName + " variable" } + return fmt.Sprintf("config file%s is not found at %s", envVar, err.Path) } diff --git a/internal/config/config_cmd.go b/internal/config/config_cmd.go new file mode 100644 index 0000000..d655d21 --- /dev/null +++ b/internal/config/config_cmd.go @@ -0,0 +1,76 @@ +package config + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/spf13/afero" + "github.com/urfave/cli/v2" +) + +var ConfigCmd = &cli.Command{ + Name: "config", + Subcommands: []*cli.Command{ + configPathCmd, + configShowCmd, + }, +} + +var configPathCmd = &cli.Command{ + Name: "path", + Action: func(_ *cli.Context) error { + fs := afero.NewOsFs() + + userHomeDir, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("cannot user home dir: %v", err) + } + + configPathFromEnv := os.Getenv(EnvVarName) + xdgHomePathFromEnv := os.Getenv(XdgEnvVarName) + + confPath, err := LocateConfFile(fs, userHomeDir, configPathFromEnv, xdgHomePathFromEnv) + if err != nil { + return fmt.Errorf("could not locate config file: %w", err) + } + + fmt.Println(confPath) + + return nil + }, +} + +var configShowCmd = &cli.Command{ + Name: "show", + Action: func(_ *cli.Context) error { + fs := afero.NewOsFs() + + userHomeDir, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("cannot user home dir: %v", err) + } + + configPathFromEnv := os.Getenv(EnvVarName) + xdgHomePathFromEnv := os.Getenv(XdgEnvVarName) + + confPath, err := LocateConfFile(fs, userHomeDir, configPathFromEnv, xdgHomePathFromEnv) + if err != nil { + return fmt.Errorf("could not locate config file: %w", err) + } + + conf, err := Load(confPath) + if err != nil { + return err + } + + confJson, err := json.MarshalIndent(conf, "", " ") + if err != nil { + return err + } + + fmt.Println(string(confJson)) + + return nil + }, +} diff --git a/internal/config/load.go b/internal/config/load.go index 2a449f6..7ed48fb 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -30,6 +30,7 @@ func Load(filename string) (*ConfigRoot, error) { if err != nil { return nil, err } + return parseYaml(contents) default: return nil, fmt.Errorf("something went horribly wrong") @@ -40,6 +41,7 @@ func formatFromFilename(filename string) string { if strings.HasSuffix(filename, ".yaml") { return yamlFormat } + return otherFormat } @@ -50,6 +52,7 @@ func LocateConfFile(fs afero.Fs, userHomeDir, confPathFromEnv string, xdgHomeFro if fileExists(fs, confPathFromEnv) { return confPathFromEnv, nil } + return "", &ErrConfigNotFound{ EnvVar: true, Path: "'" + confPathFromEnv + "'", @@ -62,6 +65,7 @@ func LocateConfFile(fs afero.Fs, userHomeDir, confPathFromEnv string, xdgHomeFro if xdgHomeFromEnv == "" { xdgHomeFromEnv = path.Join(userHomeDir, ".config") } + xdgYamlDefault := path.Join(xdgHomeFromEnv, "zit", "config.yaml") if fileExists(fs, xdgYamlDefault) { return xdgYamlDefault, nil @@ -86,9 +90,11 @@ func fileExists(fs afero.Fs, filename string) bool { if os.IsNotExist(err) { return false } + if fileInfo.IsDir() { return false } + return true } @@ -97,5 +103,6 @@ func parseYaml(contents []byte) (*ConfigRoot, error) { if err := yaml.Unmarshal(contents, &config); err != nil { return nil, err } + return &config, nil }