-
Notifications
You must be signed in to change notification settings - Fork 814
/
yaml.go
81 lines (69 loc) · 1.91 KB
/
yaml.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
* Copyright 2021 CloudWeGo Authors
*
* 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 (
"io/ioutil"
"os"
"time"
"gopkg.in/yaml.v3"
"github.com/cloudwego/kitex/internal/configutil"
)
var (
_ configutil.Config = &YamlConfig{}
_ configutil.RichTypeConfig = &YamlConfig{}
)
// YamlConfig contains configurations from yaml file.
type YamlConfig struct {
configutil.RichTypeConfig
data map[interface{}]interface{}
}
// ReadYamlConfigFile creates a YamlConfig from the file.
func ReadYamlConfigFile(yamlFile string) (*YamlConfig, error) {
fd, err := os.Open(yamlFile)
if err != nil {
return nil, err
}
defer fd.Close()
b, err := ioutil.ReadAll(fd)
if err != nil {
return nil, err
}
data := make(map[interface{}]interface{})
err = yaml.Unmarshal(b, &data)
if err != nil {
return nil, err
}
y := &YamlConfig{data: data}
y.RichTypeConfig = configutil.NewRichTypeConfig(y)
return y, nil
}
// Get implements the configutil.Config interface.
func (yc *YamlConfig) Get(key string) (interface{}, bool) {
val, ok := yc.data[key]
return val, ok
}
// GetDuration implements the configutil.RichTypeConfig interface.
// It converts string item to time.Duration.
func (yc *YamlConfig) GetDuration(key string) (time.Duration, bool) {
if s, ok := yc.data[key].(string); ok {
val, err := time.ParseDuration(s)
if err != nil {
return 0, false
}
return val, true
}
return 0, false
}