50 lines
1.2 KiB
Go
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
|
|
}
|