diff --git a/tools/goctl/api/format/format.go b/tools/goctl/api/format/format.go index a472e54b..816b9e5a 100644 --- a/tools/goctl/api/format/format.go +++ b/tools/goctl/api/format/format.go @@ -1,6 +1,7 @@ package format import ( + "bufio" "errors" "fmt" "go/format" @@ -144,10 +145,28 @@ func apiFormat(data string) (string, error) { result += strings.TrimSpace(string(fs)) + "\n\n" } if len(strings.TrimSpace(apiStruct.Service)) > 0 { - result += strings.TrimSpace(apiStruct.Service) + "\n\n" + result += formatService(apiStruct.Service) + "\n\n" } - return result, nil + return strings.TrimSpace(result), nil +} + +func formatService(str string) string { + var builder strings.Builder + scanner := bufio.NewScanner(strings.NewReader(str)) + var tapCount = 0 + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == ")" || line == "}" { + tapCount -= 1 + } + util.WriteIndent(&builder, tapCount) + builder.WriteString(line + "\n") + if strings.HasSuffix(line, "(") || strings.HasSuffix(line, "{") { + tapCount += 1 + } + } + return strings.TrimSpace(builder.String()) } func countRune(s string, r rune) int { diff --git a/tools/goctl/api/format/format_test.go b/tools/goctl/api/format/format_test.go new file mode 100644 index 00000000..a0f9444a --- /dev/null +++ b/tools/goctl/api/format/format_test.go @@ -0,0 +1,47 @@ +package format + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +const ( + notFormattedStr = ` +type Request struct { + Name string +} + +type Response struct { + Message string +} + +service A-api { +@server( +handler: GreetHandler + ) + get /greet/from/:name(Request) returns (Response) +} +` + + formattedStr = `type Request struct { + Name string +} + +type Response struct { + Message string +} + +service A-api { + @server( + handler: GreetHandler + ) + get /greet/from/:name(Request) returns (Response) +}` +) + +func TestInlineTypeNotExist(t *testing.T) { + r, err := apiFormat(notFormattedStr) + assert.Nil(t, err) + assert.Equal(t, r, formattedStr) +} diff --git a/tools/goctl/api/gogen/util.go b/tools/goctl/api/gogen/util.go index 9423d7e6..0e42e986 100644 --- a/tools/goctl/api/gogen/util.go +++ b/tools/goctl/api/gogen/util.go @@ -26,14 +26,8 @@ func getParentPackage(dir string) (string, error) { return filepath.ToSlash(filepath.Join(projectCtx.Path, strings.TrimPrefix(projectCtx.WorkDir, projectCtx.Dir))), nil } -func writeIndent(writer io.Writer, indent int) { - for i := 0; i < indent; i++ { - fmt.Fprint(writer, "\t") - } -} - func writeProperty(writer io.Writer, name, tp, tag, comment string, indent int) error { - writeIndent(writer, indent) + util.WriteIndent(writer, indent) var err error if len(comment) > 0 { comment = strings.TrimPrefix(comment, "//") diff --git a/tools/goctl/api/parser/typestate.go b/tools/goctl/api/parser/typestate.go deleted file mode 100644 index 25115e30..00000000 --- a/tools/goctl/api/parser/typestate.go +++ /dev/null @@ -1,95 +0,0 @@ -package parser - -import ( - "fmt" - "strings" - - "github.com/tal-tech/go-zero/tools/goctl/api/spec" - "github.com/tal-tech/go-zero/tools/goctl/util" -) - -type typeState struct { - *baseState - annos []spec.Annotation -} - -func newTypeState(state *baseState, annos []spec.Annotation) state { - return &typeState{ - baseState: state, - annos: annos, - } -} - -func (s *typeState) process(api *spec.ApiSpec) (state, error) { - var name string - var members []spec.Member - parser := &typeEntityParser{ - acceptName: func(n string) { - name = n - }, - acceptMember: func(member spec.Member) { - members = append(members, member) - }, - } - ent := newEntity(s.baseState, api, parser) - if err := ent.process(); err != nil { - return nil, err - } - - api.Types = append(api.Types, spec.Type{ - Name: name, - Annotations: s.annos, - Members: members, - }) - - return newRootState(s.r, s.lineNumber), nil -} - -type typeEntityParser struct { - acceptName func(name string) - acceptMember func(member spec.Member) -} - -func (p *typeEntityParser) parseLine(line string, api *spec.ApiSpec, annos []spec.Annotation) error { - index := strings.Index(line, "//") - comment := "" - if index >= 0 { - comment = line[index+2:] - line = strings.TrimSpace(line[:index]) - } - fields := strings.Fields(line) - if len(fields) == 0 { - return nil - } - if len(fields) == 1 { - p.acceptMember(spec.Member{ - Annotations: annos, - Name: fields[0], - Type: fields[0], - IsInline: true, - }) - return nil - } - name := fields[0] - tp := fields[1] - var tag string - if len(fields) > 2 { - tag = fields[2] - } else { - tag = fmt.Sprintf("`json:\"%s\"`", util.Untitle(name)) - } - - p.acceptMember(spec.Member{ - Annotations: annos, - Name: name, - Type: tp, - Tag: tag, - Comment: comment, - IsInline: false, - }) - return nil -} - -func (p *typeEntityParser) setEntityName(name string) { - p.acceptName(name) -} diff --git a/tools/goctl/api/util/util.go b/tools/goctl/api/util/util.go index 1223d521..5ddf7a26 100644 --- a/tools/goctl/api/util/util.go +++ b/tools/goctl/api/util/util.go @@ -75,3 +75,9 @@ func ComponentName(api *spec.ApiSpec) string { } return name + "Components" } + +func WriteIndent(writer io.Writer, indent int) { + for i := 0; i < indent; i++ { + fmt.Fprint(writer, "\t") + } +}