From 8401b2200ba08467f8325d178f95a01ddad4e78f Mon Sep 17 00:00:00 2001 From: LinXiaoYi <874183200@qq.com> Date: Mon, 24 May 2021 21:59:01 +0800 Subject: [PATCH] add annotator as a field formatter by annotation --- parser/annotator.go | 18 +++++++------- parser/annotator_test.go | 4 ++-- parser/parser_test.go | 52 +++++++++++++++++++++++++++++++++------- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/parser/annotator.go b/parser/annotator.go index 4822e4b..30ca09e 100644 --- a/parser/annotator.go +++ b/parser/annotator.go @@ -5,13 +5,8 @@ import ( "strings" ) -type Annotator interface { - Annotate(string) []map[string]interface{} - AnnotateToJson(string) (string, error) -} - -type Annotation struct { -} +// field formatter by annotation +type Annotator struct{} 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 //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) //split annotation with '@' lines := strings.Split(comment, "@") @@ -61,8 +56,13 @@ func (a *Annotation) Annotate(comment string) []map[string]interface{} { } //parse annotation to json -func (a *Annotation) AnnotateToJson(comment string) (string, error) { +func (a *Annotator) AnnotateToJson(comment string) (string, error) { annotate := a.Annotate(comment) result, err := json.MarshalIndent(annotate, "", " ") return string(result), err } + +func (a *Annotator) Format(field *StructField) string { + f, _ := a.AnnotateToJson(field.Doc) + return f +} diff --git a/parser/annotator_test.go b/parser/annotator_test.go index 9436403..d5f9974 100644 --- a/parser/annotator_test.go +++ b/parser/annotator_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/assert" ) -var BeeAnnotator Annotator +var BeeAnnotator *Annotator const ( Annotation1 = ` @@ -25,7 +25,7 @@ https://github.com/beego ) func TestMain(m *testing.M) { - BeeAnnotator = &Annotation{} + BeeAnnotator = &Annotator{} retCode := m.Run() //run test os.Exit(retCode) } diff --git a/parser/parser_test.go b/parser/parser_test.go index 9413765..315659d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -3,15 +3,11 @@ package beeParser import ( "fmt" "log" + "testing" + + "github.com/stretchr/testify/assert" ) -type sampleFormatter struct { -} - -func (f *sampleFormatter) Format(field *StructField) string { - return "" -} - func ExampleStructParser() { const src = ` package p @@ -36,9 +32,9 @@ type StructA struct { 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 { 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) +}