71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/Unknwon/goconfig"
 | 
						|
	"github.com/sirupsen/logrus"
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// ParseFromConfigFile parse ini file and set values by the tag of fields.
 | 
						|
// 'p' must be a pointer to the given structure, otherwise will panic.
 | 
						|
// Only process its string fields and its sub structs.
 | 
						|
func ParseFromConfigFile(section string, p any) {
 | 
						|
	conf, err := goconfig.LoadConfigFile("fotff.ini")
 | 
						|
	if err != nil {
 | 
						|
		logrus.Warnf("load config file err: %v", err)
 | 
						|
	}
 | 
						|
	rv := reflect.ValueOf(p)
 | 
						|
	rt := reflect.TypeOf(p)
 | 
						|
	for i := 0; i < rv.Elem().NumField(); i++ {
 | 
						|
		switch rt.Elem().Field(i).Type.Kind() {
 | 
						|
		case reflect.String:
 | 
						|
			key := rt.Elem().Field(i).Tag.Get("key")
 | 
						|
			if key == "" {
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			var v string
 | 
						|
			if conf != nil {
 | 
						|
				v, err = conf.GetValue(section, key)
 | 
						|
			}
 | 
						|
			if conf == nil || err != nil {
 | 
						|
				v = rt.Elem().Field(i).Tag.Get("default")
 | 
						|
			}
 | 
						|
			rv.Elem().Field(i).SetString(v)
 | 
						|
		case reflect.Slice:
 | 
						|
			if rt.Elem().Field(i).Type.Elem().Kind() != reflect.String {
 | 
						|
				break
 | 
						|
			}
 | 
						|
			key := rt.Elem().Field(i).Tag.Get("key")
 | 
						|
			if key == "" {
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			var v string
 | 
						|
			if conf != nil {
 | 
						|
				v, err = conf.GetValue(section, key)
 | 
						|
			}
 | 
						|
			if conf == nil || err != nil {
 | 
						|
				v = rt.Elem().Field(i).Tag.Get("default")
 | 
						|
			}
 | 
						|
			rv.Elem().Field(i).Set(reflect.ValueOf(strings.Split(v, ",")))
 | 
						|
		case reflect.Struct:
 | 
						|
			ParseFromConfigFile(section, rv.Elem().Field(i).Addr().Interface())
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |