Files
config/definition/generate/render/render.go
andrey f9a0411192
All checks were successful
Go Action / goaction (push) Successful in 29s
def (#12)
Reviewed-on: #12
2025-12-26 14:55:42 +03:00

50 lines
1.2 KiB
Go

package render
import (
"fmt"
"io"
"reflect"
"gitoa.ru/go-4devs/config/definition"
"gitoa.ru/go-4devs/config/definition/generate/view"
"gitoa.ru/go-4devs/config/definition/group"
"gitoa.ru/go-4devs/config/definition/option"
"gitoa.ru/go-4devs/config/definition/proto"
)
type Execute func(w io.Writer, vi view.View, rnd Rendering) error
var randders = map[reflect.Type]Execute{
reflect.TypeFor[*definition.Definition](): Template(defTpl),
reflect.TypeFor[group.Group](): Template(groupTpl),
reflect.TypeFor[option.Option](): Template(optTpl),
reflect.TypeFor[proto.Proto](): Template(protoTpl),
}
func Renders() map[reflect.Type]Execute {
return randders
}
func Add(rt reflect.Type, fn Execute) {
randders[rt] = fn
}
func Render(w io.Writer, view view.View, data Rendering) error {
rnd, ok := randders[view.Kind()]
if !ok {
return fmt.Errorf("%w:%v", ErrNotFound, view.Kind())
}
if err := rnd(w, view, data); err != nil {
return fmt.Errorf("render:%v, err:%w", view.Kind(), err)
}
for _, ch := range view.Views() {
if err := Render(w, ch, data); err != nil {
return fmt.Errorf("render[%v]:%w", ch.Name(), err)
}
}
return nil
}