You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.0 KiB
109 lines
2.0 KiB
3 years ago
|
package config
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/go-kratos/kratos/v2/config"
|
||
|
|
||
|
"github.com/polarismesh/polaris-go"
|
||
|
)
|
||
|
|
||
|
// Option is polaris config option.
|
||
|
type Option func(o *options)
|
||
|
|
||
|
type options struct {
|
||
|
namespace string
|
||
|
fileGroup string
|
||
|
fileName string
|
||
|
configFile polaris.ConfigFile
|
||
|
}
|
||
|
|
||
|
// WithNamespace with polaris config namespace
|
||
|
func WithNamespace(namespace string) Option {
|
||
|
return func(o *options) {
|
||
|
o.namespace = namespace
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// WithFileGroup with polaris config fileGroup
|
||
|
func WithFileGroup(fileGroup string) Option {
|
||
|
return func(o *options) {
|
||
|
o.fileGroup = fileGroup
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// WithFileName with polaris config fileName
|
||
|
func WithFileName(fileName string) Option {
|
||
|
return func(o *options) {
|
||
|
o.fileName = fileName
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type source struct {
|
||
|
client *polaris.ConfigAPI
|
||
|
options *options
|
||
|
}
|
||
|
|
||
|
func New(client *polaris.ConfigAPI, opts ...Option) (config.Source, error) {
|
||
|
options := &options{
|
||
|
namespace: "default",
|
||
|
fileGroup: "",
|
||
|
fileName: "",
|
||
|
}
|
||
|
|
||
|
for _, opt := range opts {
|
||
|
opt(options)
|
||
|
}
|
||
|
|
||
|
if options.fileGroup == "" {
|
||
|
return nil, errors.New("fileGroup invalid")
|
||
|
}
|
||
|
|
||
|
if options.fileName == "" {
|
||
|
return nil, errors.New("fileName invalid")
|
||
|
}
|
||
|
|
||
|
return &source{
|
||
|
client: client,
|
||
|
options: options,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// Load return the config values
|
||
|
func (s *source) Load() ([]*config.KeyValue, error) {
|
||
|
configAPI, err := polaris.NewConfigAPI()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
configFile, err := configAPI.GetConfigFile(s.options.namespace, s.options.fileGroup, s.options.fileName)
|
||
|
if err != nil {
|
||
|
fmt.Println("fail to get config.", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
content := configFile.GetContent()
|
||
|
k := s.options.fileName
|
||
|
|
||
|
s.options.configFile = configFile
|
||
|
|
||
|
return []*config.KeyValue{
|
||
|
{
|
||
|
Key: k,
|
||
|
Value: []byte(content),
|
||
|
Format: strings.TrimPrefix(filepath.Ext(k), "."),
|
||
|
},
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// Watch return the watcher
|
||
|
func (s *source) Watch() (config.Watcher, error) {
|
||
|
return newWatcher(s.options.configFile), nil
|
||
|
}
|