github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/courier/swagger/gen/utils.go (about) 1 package gen 2 3 import ( 4 "fmt" 5 "go/types" 6 "reflect" 7 "regexp" 8 "strings" 9 10 "golang.org/x/tools/go/loader" 11 12 "github.com/artisanhe/tools/codegen/loaderx" 13 "github.com/artisanhe/tools/courier" 14 ) 15 16 func getTagNameAndFlags(tagValue string) (name string, flags map[string]bool) { 17 values := strings.SplitN(tagValue, ",", -1) 18 for _, flag := range values[1:] { 19 if flags == nil { 20 flags = map[string]bool{} 21 } 22 flags[flag] = true 23 } 24 name = values[0] 25 return 26 } 27 28 func docOfTypeName(obj types.Object, program *loader.Program) string { 29 pkgInfo := program.Package(obj.Pkg().Path()) 30 for ident, def := range pkgInfo.Defs { 31 if def == obj { 32 return loaderx.CommentsOf(program.Fset, ident, pkgInfo.Files...) 33 } 34 } 35 return "" 36 } 37 38 func CommentValuesSplit(s string) (values []string) { 39 parts := strings.Split(s, " ") 40 for _, p := range parts { 41 if p != "" { 42 values = append(values, p) 43 } 44 } 45 return 46 } 47 48 func ParseSuccessMetadata(doc string) courier.Metadata { 49 metadata := courier.Metadata{} 50 51 matches := regexp.MustCompile(`@success ([^\n]+)`).FindAllStringSubmatch(doc, -1) 52 53 for _, subMatch := range matches { 54 if len(subMatch) == 2 { 55 parts := CommentValuesSplit(subMatch[1]) 56 metadata.Set(strings.TrimSpace(parts[0]), parts[1:]...) 57 } 58 } 59 60 return metadata 61 } 62 63 func reflectTypeString(tpe reflect.Type) string { 64 for tpe.Kind() == reflect.Ptr { 65 tpe = tpe.Elem() 66 } 67 return fmt.Sprintf("%s.%s", loaderx.ResolvePkgImport(tpe.PkgPath()), tpe.Name()) 68 }