github.com/tada-team/tdproto@v1.51.57/codegen/openapi/main.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "flag" 6 "fmt" 7 8 "github.com/tada-team/tdproto/codegen" 9 "github.com/tada-team/tdproto/codegen/api_paths" 10 ) 11 12 func main() { 13 serverUrl := flag.String("server", "https://web.tada.team", "URL for swagger target") 14 flag.Parse() 15 16 tdInfo, err := codegen.ParseTdproto() 17 if err != nil { 18 panic(err) 19 } 20 21 openapiInfo, err := generateOpenApiRoot(tdInfo.TdModels, []openApiServer{ 22 {Url: *serverUrl}, 23 }) 24 if err != nil { 25 panic(err) 26 } 27 28 jsonBytes, err := json.MarshalIndent(openapiInfo, "", " ") 29 if err != nil { 30 panic(err) 31 } 32 33 if _, err = fmt.Println(string(jsonBytes)); err != nil { 34 panic(err) 35 } 36 } 37 38 func addAllSchemas(tdInfo *codegen.TdPackage, root openApiRoot) error { 39 for structName := range tdInfo.TdStructs { 40 err := addStructSchema(root.Components.Schemas, structName, tdInfo) 41 if err != nil { 42 return err 43 } 44 } 45 46 for typeName := range tdInfo.TdTypes { 47 err := addTypeSchema(root.Components.Schemas, typeName, tdInfo) 48 if err != nil { 49 return err 50 } 51 } 52 53 for mapTypeName := range tdInfo.TdMapTypes { 54 err := addMapType(root.Components.Schemas, mapTypeName, tdInfo) 55 if err != nil { 56 return err 57 } 58 } 59 60 return nil 61 } 62 63 func addPaths(root *openApiRoot, pathsToAdd []api_paths.PathSpec) error { 64 65 for _, pathObject := range pathsToAdd { 66 newPath := openApiPath{} 67 68 err := pathSpecToOpenApiPath(pathObject, &newPath) 69 if err != nil { 70 return err 71 } 72 err = addPathParameters(pathObject.Path, &newPath) 73 if err != nil { 74 return err 75 } 76 77 root.Paths[pathObject.Path] = newPath 78 } 79 80 return nil 81 } 82 83 func generateOpenApiRoot(tdInfo *codegen.TdPackage, servers []openApiServer) (openApiRoot, error) { 84 root := openApiRoot{ 85 OpenApiVersion: "3.0.3", 86 Info: openApiInfo{ 87 Title: "tdproto", 88 Version: "0.0.1", // TODO: take from git tag 89 }, 90 Servers: servers, 91 //{Url: }, 92 Paths: make(map[string]openApiPath), 93 Security: []map[string][]string{ 94 {"token": {}}, 95 }, 96 Components: openApiComponents{ 97 Schemas: make(map[string]openApiSchema), 98 SecuritySchemes: map[string]openApiSecurity{ 99 "token": { 100 Type: openApiSecurityTypeApiKey, 101 In: openApiSecurityInHeader, 102 Name: "token", 103 }, 104 }, 105 }, 106 } 107 108 err := addAllSchemas(tdInfo, root) 109 if err != nil { 110 return root, err 111 } 112 113 for _, pathCollection := range api_paths.AllPaths { 114 err = addPaths(&root, pathCollection) 115 if err != nil { 116 return root, err 117 } 118 } 119 120 return root, nil 121 }