activity/tools/defs/code.go

195 行
4.0 KiB
Go

package defs
import (
"bytes"
"fmt"
"strings"
)
type StructMember struct {
Name string
Type string
Comment string
}
func (s *StructMember) Generate() string {
return fmt.Sprintf("// %s\n%s %s", s.Comment, s.Name, s.Type)
}
type StructDef struct {
Typename string
M []*StructMember
F []*MemberFunctionDef
Compose []*StructDef
Comment string
}
func (s *StructDef) Generate() string {
var b bytes.Buffer
b.WriteString(fmt.Sprintf("// %s\ntype %s struct {\n", s.Comment, s.Typename))
for _, c := range s.Compose {
b.WriteString(fmt.Sprintf("*%s\n", c.Typename))
}
for _, m := range s.M {
b.WriteString(m.Generate())
b.WriteString("\n")
}
b.WriteString("}\n\n")
for _, f := range s.F {
b.WriteString(f.Generate())
b.WriteString("\n\n")
}
return b.String()
}
type InterfaceDef struct {
Typename string
Comment string
// Body is ignored
O []string // Other interfaceDef Typenames
F []*FunctionDef
}
func (i *InterfaceDef) Generate() string {
var b bytes.Buffer
b.WriteString(fmt.Sprintf("// %s\n", i.Comment))
b.WriteString(fmt.Sprintf("type %s interface {\n", i.Typename))
for _, o := range i.O {
b.WriteString(fmt.Sprintf("%s\n", o))
}
for _, f := range i.F {
b.WriteString(fmt.Sprintf("%s(", f.Name))
var args []string
for _, a := range f.Args {
args = append(args, a.Generate())
}
b.WriteString(strings.Join(args, ", "))
b.WriteString(")")
if len(f.Return) > 0 {
b.WriteString(" (")
var ret []string
for _, r := range f.Return {
ret = append(ret, r.Generate())
}
b.WriteString(strings.Join(ret, ", "))
b.WriteString(")")
}
b.WriteString("\n")
}
b.WriteString("}\n")
return b.String()
}
type PackageDef struct {
Name string
Comment string
Imports []string
Defs []*StructDef
F []*FunctionDef
I []*InterfaceDef
Raw string
}
func (p *PackageDef) Generate() string {
var b bytes.Buffer
b.WriteString(fmt.Sprintf("// %s\npackage %s\n\n", p.Comment, p.Name))
if len(p.Imports) > 0 {
b.WriteString("import (\n")
for _, i := range p.Imports {
b.WriteString(fmt.Sprintf("\"%s\"\n", i))
}
b.WriteString(")\n\n")
}
if len(p.Raw) > 0 {
b.WriteString(p.Raw)
b.WriteString("\n\n")
}
for _, i := range p.I {
b.WriteString(i.Generate())
b.WriteString("\n\n")
}
for _, d := range p.Defs {
b.WriteString(d.Generate())
b.WriteString("\n\n")
}
for _, f := range p.F {
b.WriteString(f.Generate())
b.WriteString("\n\n")
}
return b.String()
}
type MemberFunctionDef struct {
Name string
Comment string
P *StructDef
Args []*FunctionVarDef
Return []*FunctionVarDef
Body func() string
}
func (f *MemberFunctionDef) Generate() string {
var b bytes.Buffer
b.WriteString(fmt.Sprintf("// %s\nfunc (t *%s) %s(", f.Comment, f.P.Typename, f.Name))
var args []string
for _, a := range f.Args {
args = append(args, a.Generate())
}
b.WriteString(strings.Join(args, ", "))
b.WriteString(")")
if len(f.Return) > 0 {
b.WriteString(" (")
var ret []string
for _, r := range f.Return {
ret = append(ret, r.Generate())
}
b.WriteString(strings.Join(ret, ", "))
b.WriteString(")")
}
b.WriteString(" {\n")
b.WriteString(f.Body())
b.WriteString("\n}\n\n")
return b.String()
}
type FunctionDef struct {
Name string
Comment string
Args []*FunctionVarDef
Return []*FunctionVarDef
Body func() string
}
func (f *FunctionDef) Generate() string {
var b bytes.Buffer
b.WriteString(fmt.Sprintf("// %s\nfunc %s(", f.Comment, f.Name))
var args []string
for _, a := range f.Args {
args = append(args, a.Generate())
}
b.WriteString(strings.Join(args, ", "))
b.WriteString(")")
if len(f.Return) > 0 {
b.WriteString(" (")
var ret []string
for _, r := range f.Return {
ret = append(ret, r.Generate())
}
b.WriteString(strings.Join(ret, ", "))
b.WriteString(")")
}
b.WriteString(" {\n")
b.WriteString(f.Body())
b.WriteString("\n}\n\n")
return b.String()
}
type FunctionVarDef struct {
Name string
Type string
}
func (f *FunctionVarDef) Generate() string {
return fmt.Sprintf("%s %s", f.Name, f.Type)
}