omissis/goarkitect

View on GitHub
cmd/cmdutil/cmdutil.go

Summary

Maintainability
A
0 mins
Test Coverage
package cmdutil

import (
    "errors"
    "os"
    "path/filepath"

    "golang.org/x/exp/slices"
    "gopkg.in/yaml.v3"

    logx "github.com/omissis/goarkitect/internal/x/log"
)

var (
    ErrNoOutputFormat      = errors.New("output cannot be nil")
    ErrNoConfigFileFound   = errors.New("no config files found")
    ErrUnknownOutputFormat = errors.New("unknown output format, supported ones are: json, text")
)

func GetWd() string {
    cwd, err := os.Getwd()
    if err != nil {
        logx.Fatal(err)
    }

    return cwd
}

func ListConfigFiles(cfs []string) []string {
    configFiles := make([]string, 0)

    for _, cf := range cfs {
        fileInfo, err := os.Stat(cf)
        if err != nil {
            logx.Fatal(err)
        }

        if !fileInfo.IsDir() {
            configFiles = append(configFiles, cf)

            continue
        }

        if err := filepath.Walk(cf, visitConfigFolder(&configFiles)); err != nil {
            logx.Fatal(err)
        }
    }

    slices.Sort(configFiles)

    return slices.Compact(configFiles)
}

func visitConfigFolder(files *[]string) filepath.WalkFunc {
    return func(path string, file os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        if !file.IsDir() && filepath.Ext(path) == ".yaml" {
            *files = append(*files, path)
        }

        return nil
    }
}

func LoadConfig[T any](file string) T {
    var conf T

    configData, err := os.ReadFile(file)
    if err != nil {
        logx.Fatal(err)
    }

    if err := yaml.Unmarshal(configData, &conf); err != nil {
        logx.Fatal(err)
    }

    return conf
}