| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | package confimport (	"fmt"	etcdConfig "git.ikuban.com/server/kratos-etcd/config"	"github.com/go-kratos/kratos/v2/config"	"github.com/go-kratos/kratos/v2/config/file"	clientv3 "go.etcd.io/etcd/client/v3")type Source interface {	NewSource() (config.Source, error)	Validate() bool	String() string}type Format stringconst (	Yaml Format = "yaml")var formatMap = map[Format]string{	Yaml: "yaml",}func (f Format) String() string {	return string(f)}func (f Format) Validate() bool {	_, ok := formatMap[f]	return ok}// =======================================type EtcdSource struct {	Format    Format	Client    *clientv3.Client	Namespace string	Name      string}func (s *EtcdSource) NewSource() (config.Source, error) {	source, err := etcdConfig.New(s.Client, etcdConfig.WithPath(fmt.Sprintf("/%s/config/%s", s.Namespace, s.Name)))	if err != nil {		return nil, err	}	return source, nil}func (s *EtcdSource) Validate() bool {	if !s.Format.Validate() {		return false	}	if s.Client == nil {		return false	}	if s.Namespace == "" {		return false	}	if s.Name == "" {		return false	}	return true}func (s *EtcdSource) String() string {	return fmt.Sprintf("etcd source format:%v, namespace:%v, name:%v", s.Format, s.Namespace, s.Name)}// =======================================type FileSource struct {	Format Format	Path   string}func (s *FileSource) NewSource() (config.Source, error) {	source := file.NewSource(s.Path)	return source, nil}func (s *FileSource) Validate() bool {	if !s.Format.Validate() {		return false	}	if s.Path == "" {		return false	}	return true}func (s *FileSource) String() string {	return fmt.Sprintf("file source format:%v, path:%v", s.Format, s.Path)}
 |