mirror of https://github.com/k3s-io/k3s
73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
package generic
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
type handlerEntry struct {
|
|
generation int
|
|
name string
|
|
handler Handler
|
|
}
|
|
|
|
type Handlers struct {
|
|
handlers []handlerEntry
|
|
}
|
|
|
|
func (h *Handlers) Handle(key string, obj runtime.Object) (runtime.Object, error) {
|
|
var (
|
|
errs errors
|
|
)
|
|
|
|
for _, handler := range h.handlers {
|
|
newObj, err := handler.handler(key, obj)
|
|
if err != nil {
|
|
errs = append(errs, &handlerError{
|
|
HandlerName: handler.name,
|
|
Err: err,
|
|
})
|
|
}
|
|
if newObj != nil {
|
|
obj = newObj
|
|
}
|
|
}
|
|
|
|
return obj, errs.ToErr()
|
|
}
|
|
|
|
type errors []error
|
|
|
|
func (e errors) Error() string {
|
|
buf := strings.Builder{}
|
|
for _, err := range e {
|
|
if buf.Len() > 0 {
|
|
buf.WriteString(", ")
|
|
}
|
|
buf.WriteString(err.Error())
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
func (e errors) ToErr() error {
|
|
switch len(e) {
|
|
case 0:
|
|
return nil
|
|
case 1:
|
|
return e[0]
|
|
default:
|
|
return e
|
|
}
|
|
}
|
|
|
|
type handlerError struct {
|
|
HandlerName string
|
|
Err error
|
|
}
|
|
|
|
func (h handlerError) Error() string {
|
|
return fmt.Sprintf("handler %s: %v", h.HandlerName, h.Err)
|
|
}
|