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  }