You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.6 KiB
89 lines
1.6 KiB
10 months ago
|
package group
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"text/template"
|
||
|
|
||
|
"gitoa.ru/go-4devs/config/definition"
|
||
|
"gitoa.ru/go-4devs/config/definition/generate"
|
||
|
)
|
||
|
|
||
|
//nolint:gochecknoinits
|
||
|
func init() {
|
||
|
generate.MustAdd(Kind, handle)
|
||
|
}
|
||
|
|
||
|
func handle(w io.Writer, data generate.Handler, option definition.Option) error {
|
||
|
group, ok := option.(Group)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("%w:%T", generate.ErrWrongType, option)
|
||
|
}
|
||
|
|
||
|
viewData := View{
|
||
|
Group: group,
|
||
|
ParentName: data.StructName(),
|
||
|
ViewOption: data.Options(),
|
||
|
}
|
||
|
|
||
|
err := tpl.Execute(w, viewData)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("render group:%w", err)
|
||
|
}
|
||
|
|
||
|
childData := ChildData{
|
||
|
Handler: data,
|
||
|
structName: viewData.StructName(),
|
||
|
keys: append(data.Keys(), group.Name),
|
||
|
}
|
||
|
for idx, child := range group.Options {
|
||
|
if cerr := data.Handle(w, childData, child); cerr != nil {
|
||
|
return fmt.Errorf("render group child[%d]:%w", idx, cerr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type ChildData struct {
|
||
|
generate.Handler
|
||
|
structName string
|
||
|
keys []string
|
||
|
}
|
||
|
|
||
|
func (c ChildData) StructName() string {
|
||
|
return c.structName
|
||
|
}
|
||
|
|
||
|
func (c ChildData) Keys() []string {
|
||
|
return c.keys
|
||
|
}
|
||
|
|
||
|
type View struct {
|
||
|
Group
|
||
|
ParentName string
|
||
|
generate.ViewOption
|
||
|
}
|
||
|
|
||
|
func (v View) FuncName() string {
|
||
|
return generate.FuncName(v.Name)
|
||
|
}
|
||
|
|
||
|
func (v View) StructName() string {
|
||
|
return generate.FuncName(v.Prefix + v.Name + v.Suffix)
|
||
|
}
|
||
|
|
||
|
//nolint:gochecknoglobals
|
||
|
var (
|
||
|
tpl = template.Must(template.New("tpls").Parse(gpoupTemplate))
|
||
|
gpoupTemplate = `type {{.StructName}} struct {
|
||
|
{{.ParentName}}
|
||
|
}
|
||
|
|
||
|
// {{.FuncName}} {{.Description}}.
|
||
|
func (i {{.ParentName}}) {{.FuncName}}() {{.StructName}} {
|
||
|
return {{.StructName}}{i}
|
||
|
}
|
||
|
`
|
||
|
)
|