github.com/tada-team/tdproto@v1.51.57/codegen/sphinx/events/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"sort"
     7  	"strings"
     8  	"text/template"
     9  
    10  	"github.com/tada-team/tdproto/codegen"
    11  )
    12  
    13  func main() {
    14  	tdprotoInfo, err := codegen.ParseTdproto()
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  
    19  	clientEvents, serverEvents, err := generateRstServerEvents(tdprotoInfo.TdModels)
    20  	if err != nil {
    21  		panic(err)
    22  	}
    23  
    24  	if err := printRstEvents(clientEvents, serverEvents); err != nil {
    25  		panic(err)
    26  	}
    27  }
    28  
    29  type rstEventField struct {
    30  	Name string
    31  	Help string
    32  }
    33  
    34  type rstEvent struct {
    35  	Name           string
    36  	Help           string
    37  	Example        string
    38  	EventStructStr string
    39  	Fields         []rstEventField
    40  }
    41  
    42  func generateRstServerEvents(tdprotoInfo *codegen.TdPackage) (clientEvents []rstEvent, serverEvents []rstEvent, err error) {
    43  	for eventStructName, eventStr := range tdprotoInfo.TdEvents {
    44  		eventExample, ok := eventExampleStr[eventStr]
    45  		if !ok {
    46  			eventExample = ""
    47  		}
    48  
    49  		originalStruct, ok := tdprotoInfo.TdStructs[eventStructName]
    50  		if !ok {
    51  			fmt.Fprintf(os.Stderr, "Failed to find struct %s of event %s.\n", eventStructName, eventStr)
    52  			continue
    53  		}
    54  
    55  		eventExampleFormatted := strings.ReplaceAll(eventExample, "\n", "\n   ")
    56  
    57  		event := rstEvent{
    58  			Name:           eventStr,
    59  			Help:           originalStruct.Help,
    60  			Example:        eventExampleFormatted,
    61  			EventStructStr: eventStructName,
    62  		}
    63  
    64  		var paramsStruct codegen.TdStruct
    65  
    66  		for _, originalField := range originalStruct.Fields {
    67  			if originalField.Name == "Params" {
    68  				paramsStruct, ok = tdprotoInfo.TdStructs[originalField.TypeStr]
    69  				if !ok {
    70  					fmt.Fprintf(os.Stderr, "Failed to find parameter type %s of event %s.\n", originalField.TypeStr, eventStructName)
    71  					continue
    72  				}
    73  			}
    74  		}
    75  
    76  		for _, paramField := range paramsStruct.GetAllJsonFields(tdprotoInfo) {
    77  			fieldHelp := paramField.Help
    78  			if fieldHelp == "" {
    79  				fieldHelp = "DOCUMENTATION MISSING"
    80  			}
    81  
    82  			event.Fields = append(event.Fields, rstEventField{
    83  				Name: paramField.JsonName,
    84  				Help: fieldHelp,
    85  			})
    86  		}
    87  
    88  		sort.Slice(event.Fields, func(i, j int) bool {
    89  			return strings.ToLower(event.Fields[i].Name) < strings.ToLower(event.Fields[j].Name)
    90  		})
    91  
    92  		if strings.HasPrefix(event.Name, "client") {
    93  			clientEvents = append(clientEvents, event)
    94  		} else {
    95  			serverEvents = append(serverEvents, event)
    96  		}
    97  	}
    98  
    99  	sort.Slice(clientEvents, func(i, j int) bool {
   100  		return strings.ToLower(clientEvents[i].Name) < strings.ToLower(clientEvents[j].Name)
   101  	})
   102  
   103  	sort.Slice(serverEvents, func(i, j int) bool {
   104  		return strings.ToLower(serverEvents[i].Name) < strings.ToLower(serverEvents[j].Name)
   105  	})
   106  
   107  	return clientEvents, serverEvents, nil
   108  }
   109  
   110  var eventTemplate = template.Must(template.New("rstEvent").Parse(`
   111  {{.Name}}
   112  ----------------------------------------------------------------------------
   113  
   114  {{.Help}}
   115  {{range $field := .Fields}}
   116  * ` + "``" + "{{$field.Name}}" + "``" + ` - {{$field.Help}}{{end}}
   117  
   118  {{if .Example -}}
   119  .. code-block:: json
   120     
   121     {{.Example}}
   122  
   123  {{else}}**MISSING EXAMPLE**
   124  {{end}}`))
   125  
   126  func printRstEvents(clientEvents []rstEvent, serverEvents []rstEvent) error {
   127  	_, err := fmt.Fprintln(os.Stdout, `Client events
   128  ======================================`)
   129  	if err != nil {
   130  		return err
   131  	}
   132  
   133  	for _, event := range clientEvents {
   134  		err := eventTemplate.Execute(os.Stdout, event)
   135  		if err != nil {
   136  			return err
   137  		}
   138  	}
   139  
   140  	_, err = fmt.Fprintln(os.Stdout, `Server events
   141  ======================================`)
   142  	if err != nil {
   143  		return err
   144  	}
   145  
   146  	for _, event := range serverEvents {
   147  		err := eventTemplate.Execute(os.Stdout, event)
   148  		if err != nil {
   149  			return err
   150  		}
   151  	}
   152  
   153  	return nil
   154  }