add annotator as a field formatter by annotation

This commit is contained in:
LinXiaoYi 2021-05-24 21:59:01 +08:00
parent 102d5f8cc9
commit 8401b2200b
3 changed files with 54 additions and 20 deletions

View File

@ -5,13 +5,8 @@ import (
"strings" "strings"
) )
type Annotator interface { // field formatter by annotation
Annotate(string) []map[string]interface{} type Annotator struct{}
AnnotateToJson(string) (string, error)
}
type Annotation struct {
}
func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\r' } func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\r' }
@ -44,7 +39,7 @@ func handleWhitespaceValues(values []string) []string {
//parse annotation to generate array with key and values //parse annotation to generate array with key and values
//start with "@" as a key-value pair,key and values are separated by a space,wrap to distinguish values. //start with "@" as a key-value pair,key and values are separated by a space,wrap to distinguish values.
func (a *Annotation) Annotate(comment string) []map[string]interface{} { func (a *Annotator) Annotate(comment string) []map[string]interface{} {
results := make([]map[string]interface{}, 0) results := make([]map[string]interface{}, 0)
//split annotation with '@' //split annotation with '@'
lines := strings.Split(comment, "@") lines := strings.Split(comment, "@")
@ -61,8 +56,13 @@ func (a *Annotation) Annotate(comment string) []map[string]interface{} {
} }
//parse annotation to json //parse annotation to json
func (a *Annotation) AnnotateToJson(comment string) (string, error) { func (a *Annotator) AnnotateToJson(comment string) (string, error) {
annotate := a.Annotate(comment) annotate := a.Annotate(comment)
result, err := json.MarshalIndent(annotate, "", " ") result, err := json.MarshalIndent(annotate, "", " ")
return string(result), err return string(result), err
} }
func (a *Annotator) Format(field *StructField) string {
f, _ := a.AnnotateToJson(field.Doc)
return f
}

View File

@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
var BeeAnnotator Annotator var BeeAnnotator *Annotator
const ( const (
Annotation1 = ` Annotation1 = `
@ -25,7 +25,7 @@ https://github.com/beego
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
BeeAnnotator = &Annotation{} BeeAnnotator = &Annotator{}
retCode := m.Run() //run test retCode := m.Run() //run test
os.Exit(retCode) os.Exit(retCode)
} }

View File

@ -3,15 +3,11 @@ package beeParser
import ( import (
"fmt" "fmt"
"log" "log"
"testing"
"github.com/stretchr/testify/assert"
) )
type sampleFormatter struct {
}
func (f *sampleFormatter) Format(field *StructField) string {
return ""
}
func ExampleStructParser() { func ExampleStructParser() {
const src = ` const src = `
package p package p
@ -36,9 +32,9 @@ type StructA struct {
Field7 StructB Field7 StructB
} }
` `
formatter := &sampleFormatter{} annotator := &Annotator{}
sp, err := NewStructParser("src.go", src, "StructA", formatter) sp, err := NewStructParser("src.go", src, "StructA", annotator)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -66,3 +62,41 @@ type StructA struct {
// } // }
// } // }
} }
func TestParseStructByFieldAnnotation(t *testing.T) {
const src = `
package p
type StructA struct {
//@Name Field1
//@DefaultValues bee test
// beego test
Field1 string
}
`
expect := `[
{
"Name": [
"Field1"
]
},
{
"DefaultValues": [
"bee test",
"beego test"
]
}
]`
annotator := &Annotator{}
sp, err := NewStructParser("src.go", src, "StructA", annotator)
if err != nil {
log.Fatal(err)
}
actual := sp.FieldFormatter.Format(sp.MainStruct.Fields[0])
assert.Equal(t, expect, actual)
}