71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package apapter
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync/atomic"
|
|
|
|
"github.com/gogf/gf/v2/container/gvar"
|
|
"github.com/gogf/gf/v2/encoding/gbase64"
|
|
"github.com/gogf/gf/v2/encoding/gjson"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"google.golang.org/grpc/metadata"
|
|
)
|
|
|
|
/**
|
|
* 原子钟接口配置
|
|
* @author dc.To
|
|
* @version 20250807
|
|
*/
|
|
type AtomicAdapter struct {
|
|
store atomic.Value
|
|
adapter string
|
|
}
|
|
|
|
func NewAtomicAdapter(ctx context.Context, adapter string) *AtomicAdapter {
|
|
a := &AtomicAdapter{adapter: adapter}
|
|
md, ok := metadata.FromIncomingContext(ctx)
|
|
if ok {
|
|
if c := md.Get(a.adapter); len(c) > 0 {
|
|
a.SetContent(gjson.New(gbase64.MustDecodeToString(c[0])).Map())
|
|
} else {
|
|
g.Log("cfg").Error(ctx, "No Metadata from incoming cfg context")
|
|
}
|
|
}
|
|
return a
|
|
}
|
|
|
|
func (a *AtomicAdapter) SetContent(content map[string]interface{}) error {
|
|
a.store.Store(content)
|
|
return nil
|
|
}
|
|
|
|
func (a *AtomicAdapter) Available(ctx context.Context, resource ...string) (ok bool) {
|
|
return a.store.Load() != nil
|
|
}
|
|
|
|
func (a *AtomicAdapter) Get(ctx context.Context, pattern string) (value interface{}, err error) {
|
|
raw := a.store.Load()
|
|
if raw == nil {
|
|
return nil, errors.New("config not loaded")
|
|
}
|
|
data := raw.(map[string]interface{})
|
|
if v, ok := data[pattern]; ok {
|
|
return gvar.New(v), nil
|
|
}
|
|
return gvar.New(nil), nil
|
|
}
|
|
|
|
func (a *AtomicAdapter) Data(ctx context.Context) (data map[string]interface{}, err error) {
|
|
raw := a.store.Load()
|
|
if raw == nil {
|
|
return nil, errors.New("config not loaded")
|
|
}
|
|
original := raw.(map[string]interface{})
|
|
clone := make(map[string]interface{}, len(original))
|
|
for k, v := range original {
|
|
clone[k] = v
|
|
}
|
|
return clone, nil
|
|
}
|