go-common/app/tool/gorpc/model/models.go
2019-04-22 18:49:16 +08:00

167 lines
3.0 KiB
Go

package model
import (
"strings"
"unicode"
)
type Expression struct {
Value string
IsStar bool
IsVariadic bool
IsWriter bool
Underlying string
}
func (e *Expression) String() string {
value := e.Value
if e.IsStar {
value = "*" + value
}
if e.IsVariadic {
return "[]" + value
}
return value
}
type Field struct {
Name string
Type *Expression
Index int
}
func (f *Field) IsWriter() bool {
return f.Type.IsWriter
}
func (f *Field) IsStruct() bool {
return strings.HasPrefix(f.Type.Underlying, "struct")
}
func (f *Field) IsBasicType() bool {
return isBasicType(f.Type.String()) || isBasicType(f.Type.Underlying)
}
func isBasicType(t string) bool {
switch t {
case "bool", "string", "int", "int8", "int16", "int32", "int64", "uint",
"uint8", "uint16", "uint32", "uint64", "uintptr", "byte", "rune",
"float32", "float64", "complex64", "complex128":
return true
default:
return false
}
}
func (f *Field) IsNamed() bool {
return f.Name != "" && f.Name != "_"
}
func (f *Field) ShortName() string {
return strings.ToLower(string([]rune(f.Type.Value)[0]))
}
type Receiver struct {
*Field
Fields []*Field
}
type Function struct {
Name string
IsExported bool
Receiver *Receiver
Parameters []*Field
Results []*Field
ReturnsError bool
}
func (f *Function) TestParameters() []*Field {
var ps []*Field
for _, p := range f.Parameters {
if p.IsWriter() {
continue
}
ps = append(ps, p)
}
return ps
}
func (f *Function) TestResults() []*Field {
var ps []*Field
ps = append(ps, f.Results...)
for _, p := range f.Parameters {
if !p.IsWriter() {
continue
}
ps = append(ps, &Field{
Name: p.Name,
Type: &Expression{
Value: "string",
IsWriter: true,
Underlying: "string",
},
Index: len(ps),
})
}
return ps
}
func (f *Function) ReturnsMultiple() bool {
return len(f.Results) > 1
}
func (f *Function) OnlyReturnsOneValue() bool {
return len(f.Results) == 1 && !f.ReturnsError
}
func (f *Function) OnlyReturnsError() bool {
return len(f.Results) == 0 && f.ReturnsError
}
func (f *Function) FullName() string {
var r string
if f.Receiver != nil {
r = f.Receiver.Type.Value
}
return strings.Title(r) + strings.Title(f.Name)
}
func (f *Function) TestName() string {
if f.Receiver != nil {
receiverType := f.Receiver.Type.Value
if unicode.IsLower([]rune(receiverType)[0]) {
receiverType = "_" + receiverType
}
return "Test" + receiverType + "_" + f.Name
}
if unicode.IsLower([]rune(f.Name)[0]) {
return "Test_" + f.Name
}
return "Test" + f.Name
}
func (f *Function) IsNaked() bool {
return f.Receiver == nil && len(f.Parameters) == 0 && len(f.Results) == 0
}
type Import struct {
Name, Path string
}
type Header struct {
Comments []string
Package string
Imports []*Import
Code []byte
}
type Path string
func (p Path) TestPath() string {
return strings.TrimSuffix(string(p), ".go") + "_test.go"
}
func (p Path) IsTestPath() bool {
return strings.HasSuffix(string(p), "_test.go")
}