github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/flagparse/yaml.go (about)

     1  package flagparse
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"reflect"
     8  
     9  	"github.com/bingoohuang/gg/pkg/man"
    10  	"github.com/bingoohuang/gg/pkg/yaml"
    11  	"github.com/bingoohuang/gg/pkg/yaml/ast"
    12  )
    13  
    14  func decodeSize(node ast.Node, typ reflect.Type) (reflect.Value, error) {
    15  	if s, ok := node.(*ast.StringNode); ok {
    16  		if v, err := man.ParseBytes(s.Value); err != nil {
    17  			return reflect.Value{}, err
    18  		} else {
    19  			return yaml.CastUint64(v, typ)
    20  		}
    21  	}
    22  	return reflect.Value{}, yaml.ErrContinue
    23  }
    24  
    25  func LoadConfFile(confFile, defaultConfFile string, app interface{}) error {
    26  	if confFile == "" {
    27  		if s, err := os.Stat(defaultConfFile); err != nil || s.IsDir() {
    28  			return nil // not exists
    29  		}
    30  		confFile = defaultConfFile
    31  	}
    32  
    33  	data, err := os.ReadFile(confFile)
    34  	if err != nil {
    35  		return fmt.Errorf("read conf file %s error: %q", confFile, err)
    36  	}
    37  
    38  	sizeLabel := yaml.LabelDecoder("size", decodeSize)
    39  	decoder := yaml.NewDecoder(bytes.NewReader(data), sizeLabel)
    40  
    41  	if err := decoder.Decode(app); err != nil {
    42  		return fmt.Errorf("decode conf file %s error:%q", confFile, err)
    43  	}
    44  
    45  	return nil
    46  }