74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
|
package codegen
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"text/template"
|
||
|
|
||
|
"github.com/sunboyy/repogen/internal/code"
|
||
|
)
|
||
|
|
||
|
const functionTemplate = `
|
||
|
func {{.Name}}({{.GenParams}}){{.GenReturns}} {
|
||
|
{{.Body}}
|
||
|
}
|
||
|
`
|
||
|
|
||
|
// FunctionBuilder is an implementer of a function.
|
||
|
type FunctionBuilder struct {
|
||
|
Name string
|
||
|
Params []code.Param
|
||
|
Returns []code.Type
|
||
|
Body string
|
||
|
}
|
||
|
|
||
|
// Impl writes function declatation code to the buffer.
|
||
|
func (fb FunctionBuilder) Impl(buffer *bytes.Buffer) error {
|
||
|
tmpl, err := template.New("function").Parse(functionTemplate)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// writing to a buffer should not cause errors.
|
||
|
_ = tmpl.Execute(buffer, fb)
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (fb FunctionBuilder) GenParams() string {
|
||
|
return generateParams(fb.Params)
|
||
|
}
|
||
|
|
||
|
func (fb FunctionBuilder) GenReturns() string {
|
||
|
return generateReturns(fb.Returns)
|
||
|
}
|
||
|
|
||
|
func generateParams(params []code.Param) string {
|
||
|
var paramList []string
|
||
|
for _, param := range params {
|
||
|
paramList = append(
|
||
|
paramList,
|
||
|
fmt.Sprintf("%s %s", param.Name, param.Type.Code()),
|
||
|
)
|
||
|
}
|
||
|
return strings.Join(paramList, ", ")
|
||
|
}
|
||
|
|
||
|
func generateReturns(returns []code.Type) string {
|
||
|
if len(returns) == 0 {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
if len(returns) == 1 {
|
||
|
return " " + returns[0].Code()
|
||
|
}
|
||
|
|
||
|
var returnList []string
|
||
|
for _, ret := range returns {
|
||
|
returnList = append(returnList, ret.Code())
|
||
|
}
|
||
|
|
||
|
return fmt.Sprintf(" (%s)", strings.Join(returnList, ", "))
|
||
|
}
|