Files
config/param/param.go
2025-11-21 13:30:53 +03:00

65 lines
773 B
Go

package param
import (
"slices"
)
var (
emptyParam = empty{}
)
type Param interface {
Value(key any) (any, bool)
}
func Chain(vals ...Param) Param {
slices.Reverse(vals)
return chain(vals)
}
func With(parent Param, key, val any) Param {
return value{
Param: parent,
key: key,
val: val,
}
}
func New() Param {
return emptyParam
}
type empty struct{}
func (v empty) Value(_ any) (any, bool) {
return nil, false
}
type value struct {
Param
key, val any
}
func (v value) Value(key any) (any, bool) {
if v.key == key {
return v.val, true
}
return v.Param.Value(key)
}
type chain []Param
func (c chain) Value(key any) (any, bool) {
for _, p := range c {
val, ok := p.Value(key)
if ok {
return val, ok
}
}
return nil, false
}