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 }