64 lines
1.3 KiB
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
|
||
|
}
|