add config definition
This commit is contained in:
27
definition/group/group.go
Executable file
27
definition/group/group.go
Executable file
@@ -0,0 +1,27 @@
|
||||
package group
|
||||
|
||||
import (
|
||||
"gitoa.ru/go-4devs/config/definition"
|
||||
)
|
||||
|
||||
const Kind = "group"
|
||||
|
||||
var _ definition.Option = Group{}
|
||||
|
||||
func New(name, desc string, opts ...definition.Option) Group {
|
||||
return Group{
|
||||
Name: name,
|
||||
Description: desc,
|
||||
Options: opts,
|
||||
}
|
||||
}
|
||||
|
||||
type Group struct {
|
||||
Options definition.Options
|
||||
Name string
|
||||
Description string
|
||||
}
|
||||
|
||||
func (o Group) Kind() string {
|
||||
return Kind
|
||||
}
|
||||
88
definition/group/view.go
Normal file
88
definition/group/view.go
Normal file
@@ -0,0 +1,88 @@
|
||||
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}
|
||||
}
|
||||
`
|
||||
)
|
||||
Reference in New Issue
Block a user