protoc-gen-coco/model_generate.go

64 lines
1.3 KiB
Go

package main
import (
"bytes"
"fmt"
"text/template"
"google.golang.org/protobuf/compiler/protogen"
)
const ModelTpl = `const TableName{{.ModelName}} = "{{.TableName}}"
func (t *{{.ModelName}}) TableName() string {
return "{{.TableName}}"
}
{{range $structs := .DbFields}}
func (m *{{$.ModelName}}) Get{{$structs.FieldName}}Field() string {
return "{{$structs.BsonField}}"
}
{{end}}
`
type DbField struct {
FieldName string
BsonField string
}
type model struct {
ModelName string
TableName string
PackageName string
DbFields []*DbField
}
func GenerateModel(message *protogen.Message, packageName string) (string, error) {
var name = message.GoIdent.GoName
var entry = &model{
ModelName: name,
TableName: GetCommentTableName(message),
PackageName: packageName,
}
for _, field := range message.Fields {
var dbField = &DbField{
FieldName: field.GoName,
BsonField: GetCommentBsonName(field),
}
entry.DbFields = append(entry.DbFields, dbField)
}
tpl, err := template.New("model_tpl").Parse(ModelTpl)
if err != nil {
return "", fmt.Errorf("parse %s template failed: %v", name, err)
}
tpl.DefinedTemplates()
var buf bytes.Buffer
if err = tpl.Execute(&buf, entry); err != nil {
return "", fmt.Errorf("execute %s template failed: %v", name, err)
}
return buf.String(), nil
}