forked from oauth2-proxy/oauth2-proxy
-
Notifications
You must be signed in to change notification settings - Fork 3
/
load.go
77 lines (64 loc) · 1.98 KB
/
load.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
package oidc
import (
"fmt"
"github.com/higress-group/oauth2-proxy/pkg/apis/options"
"github.com/higress-group/oauth2-proxy/pkg/mapstructure"
"github.com/higress-group/oauth2-proxy/pkg/validation"
"github.com/tidwall/gjson"
)
func LoadOptions(json gjson.Result) (*options.Options, error) {
input := gjsonToResultMap(json)
opts, err := loadLegacyOptions(input)
if err = validation.Validate(opts); err != nil {
return opts, err
}
return opts, err
}
// loadLegacyOptions loads the old toml options using the legacy flag set
// and legacy options struct.
func loadLegacyOptions(input map[string]interface{}) (*options.Options, error) {
legacyOpts := options.NewLegacyOptions()
err := mapstructure.Decode(input, &legacyOpts)
if err != nil {
return nil, fmt.Errorf("failed to decode input: %v", err)
}
opts, err := legacyOpts.ToOptions()
if err != nil {
return nil, fmt.Errorf("failed to convert config: %v", err)
}
return opts, nil
}
func gjsonToResultMap(result gjson.Result) map[string]interface{} {
// 我们需要一个 map 来对应 JSON 对象
resultMap := make(map[string]interface{})
// 遍历 JSON 对象的每个成员
result.ForEach(func(key, value gjson.Result) bool {
resultMap[key.String()] = gjsonToInterface(value)
return true // 继续遍历
})
return resultMap
}
// gjsonToInterface 将 gjson.Result 转换为 interface{}
func gjsonToInterface(result gjson.Result) interface{} {
switch {
case result.IsArray():
// Result 是一个数组,转换每个元素
values := result.Array()
array := make([]interface{}, len(values))
for i, value := range values {
array[i] = gjsonToInterface(value)
}
return array
case result.IsObject():
// Result 是一个对象,转换每个成员
objMap := make(map[string]interface{})
result.ForEach(func(key, value gjson.Result) bool {
objMap[key.String()] = gjsonToInterface(value)
return true // 继续遍历
})
return objMap
default:
// 为空或为其他复杂类型
return result.Value()
}
}