57 lines
895 B
Go
57 lines
895 B
Go
package yourconfig
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"sync/atomic"
|
|
)
|
|
|
|
var defaultLogger atomic.Pointer[Provider]
|
|
|
|
func init() {
|
|
defaultLogger.Store(newProvider())
|
|
}
|
|
|
|
func SetDefault(provider *Provider) {
|
|
defaultLogger.Store(provider)
|
|
}
|
|
|
|
func Default() *Provider {
|
|
return defaultLogger.Load()
|
|
}
|
|
|
|
type Handler interface {
|
|
Get(ctx context.Context, key string) (string, error)
|
|
}
|
|
|
|
type Provider struct {
|
|
handler Handler
|
|
}
|
|
|
|
func (p *Provider) Get(ctx context.Context, key string) (string, error) {
|
|
return p.handler.Get(ctx, key)
|
|
}
|
|
|
|
func newProvider() *Provider {
|
|
return &Provider{
|
|
handler: defaultHandler(),
|
|
}
|
|
}
|
|
|
|
func New(handler Handler) *Provider {
|
|
return &Provider{
|
|
handler: handler,
|
|
}
|
|
}
|
|
|
|
type envHandler struct{}
|
|
|
|
func (e *envHandler) Get(ctx context.Context, key string) (string, error) {
|
|
val := os.Getenv(key)
|
|
return val, nil
|
|
}
|
|
|
|
func defaultHandler() Handler {
|
|
return &envHandler{}
|
|
}
|