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 }