omissis/goarkitect

View on GitHub
internal/x/cobra/flags.go

Summary

Maintainability
A
0 mins
Test Coverage
package cobra

import (
    "fmt"
    "strings"

    "github.com/spf13/cobra"
    "github.com/spf13/pflag"
    "github.com/spf13/viper"
)

func InitEnvs(envPrefix string) *viper.Viper {
    v := viper.New()

    v.SetEnvPrefix(envPrefix)

    v.AutomaticEnv()

    return v
}

func BindFlags(cmd *cobra.Command, v *viper.Viper, logger func(v error), envPrefix string) {
    cmd.Flags().VisitAll(func(f *pflag.Flag) {
        if strings.Contains(f.Name, "-") {
            envSuffix := strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_"))

            env := envSuffix
            if envPrefix != "" {
                env = fmt.Sprintf("%s_%s", envPrefix, envSuffix)
            }

            if err := v.BindEnv(f.Name, env); err != nil {
                logger(err)
            }
        }

        if !f.Changed && v.IsSet(f.Name) {
            val := v.Get(f.Name)

            if err := cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val)); err != nil {
                logger(err)
            }
        }
    })
}