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 }