uniugm/admin/lib/flags/flags.go
2025-04-18 17:17:23 +08:00

77 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package flags
import (
"flag"
"fmt"
"os"
"reflect"
"strconv"
"unsafe"
)
// ParseWithStructPointers 启动参数解析如果启动参数没有指定会去env里查找同名参数
// flagStructPointers为结构体指针数组
func ParseWithStructPointers(flagStructPointers ...interface{}) {
for _, st := range flagStructPointers {
flagParseStruct2Flags(st)
}
flag.Parse()
}
func flagParseStruct2Flags(st interface{}) {
if st == nil {
return
}
var stTo = reflect.TypeOf(st)
var stVo = reflect.ValueOf(st)
switch stTo.Kind() {
case reflect.Ptr:
stTo = stTo.Elem()
stVo = stVo.Elem()
// case reflect.Struct:
// break
default:
panic(fmt.Errorf("invalid flags parse struct(%+v), must be pointer or struct", st))
}
for i := 0; i < stTo.NumField(); i++ {
field := stTo.Field(i)
key, find := field.Tag.Lookup("env")
if !find {
continue
}
desc := field.Tag.Get("desc")
defaultValue, find := os.LookupEnv(key)
if !find {
defaultValue, find = field.Tag.Lookup("default")
if !find {
defaultValue = ""
}
}
var fieldValuePointer = unsafe.Pointer(stVo.Field(i).Addr().Pointer())
switch field.Type.Kind() {
case reflect.String:
flag.StringVar((*string)(fieldValuePointer), key, defaultValue, desc)
case reflect.Int:
defaultValue1, _ := strconv.Atoi(defaultValue)
flag.IntVar((*int)(fieldValuePointer), key, defaultValue1, desc)
case reflect.Int64:
defaultValue1, _ := strconv.ParseInt(defaultValue, 10, 64)
flag.Int64Var((*int64)(fieldValuePointer), key, defaultValue1, desc)
case reflect.Bool:
flag.BoolVar((*bool)(fieldValuePointer), key, defaultValue == "true", desc)
default:
panic(fmt.Errorf("parse flag kind invalid,must be string/int/int64/bool, not %+v", field.Type.Kind()))
}
}
return
}