github.com/tada-team/tdproto@v1.51.57/codegen/markdown/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  	if err := generateMarkdown(tdprotoInfo.TdModels); err != nil {
    20  		panic(err)
    21  	}
    22  }
    23  
    24  type markdownEvent struct {
    25  	Name           string
    26  	Help           string
    27  	Example        string
    28  	EventStructStr string
    29  }
    30  
    31  type markdownStructField struct {
    32  	codegen.TdStructField
    33  }
    34  
    35  type markdownStruct struct {
    36  	codegen.TdStruct
    37  	Fields []markdownStructField
    38  }
    39  
    40  func createMarkdownEvents(tdprotoInfo *codegen.TdPackage) (events []markdownEvent, err error) {
    41  	for eventStructName, eventStr := range tdprotoInfo.TdEvents {
    42  		eventExample, ok := eventExampleStr[eventStr]
    43  		if !ok {
    44  			eventExample = "EVENT MISSING EXAMPLE"
    45  		}
    46  
    47  		events = append(events, markdownEvent{
    48  			Name:           eventStr,
    49  			Help:           tdprotoInfo.TdStructs[eventStructName].Help,
    50  			Example:        eventExample,
    51  			EventStructStr: eventStructName,
    52  		})
    53  	}
    54  
    55  	sort.Slice(events, func(i, j int) bool {
    56  		return strings.ToLower(events[i].Name) < strings.ToLower(events[j].Name)
    57  	})
    58  
    59  	return events, nil
    60  }
    61  
    62  func generateMarkdown(tdprotoInfo *codegen.TdPackage) error {
    63  	_, _ = fmt.Fprintln(os.Stdout, "## Structures")
    64  
    65  	for _, tdStructInfo := range tdprotoInfo.TdStructs {
    66  		if tdStructInfo.Help == "" {
    67  			continue
    68  		}
    69  
    70  		structureToPrint := markdownStruct{
    71  			TdStruct: tdStructInfo,
    72  			Fields:   make([]markdownStructField, 0),
    73  		}
    74  
    75  		for _, field := range tdStructInfo.GetAllJsonFields(tdprotoInfo) {
    76  			if field.Help == "" {
    77  				continue
    78  			}
    79  
    80  			structureToPrint.Fields = append(structureToPrint.Fields, markdownStructField{
    81  				TdStructField: field,
    82  			})
    83  		}
    84  
    85  		if err := structureTemplate.Execute(os.Stdout, structureToPrint); err != nil {
    86  			return err
    87  		}
    88  	}
    89  
    90  	_, _ = fmt.Fprintln(os.Stdout, "## Events")
    91  
    92  	markdownEvents, err := createMarkdownEvents(tdprotoInfo)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	for _, event := range markdownEvents {
    98  		if err := eventTemplate.Execute(os.Stdout, event); err != nil {
    99  			return err
   100  		}
   101  	}
   102  	return nil
   103  }
   104  
   105  var structureTemplate = template.Must(template.New("markdownStructure").Parse(`
   106  ### {{.TdStruct.Name}}
   107  {{.TdStruct.Help}}
   108  {{range $field := .Fields}}
   109  * **{{ $field.TdStructField.JsonName }}** (
   110      {{- if $field.TdStructField.IsPrimitive -}} {{- $field.TdStructField.TypeStr -}} {{ else }} [{{- $field.TdStructField.TypeStr -}}](#{{- $field.TdStructField.TypeStr -}}) {{ end }}
   111  	{{- if $field.TdStructField.IsReadOnly }}, readonly for clients{{ end -}}
   112  	{{- if $field.TdStructField.IsPointer }}, nullable{{ end -}}
   113  	{{- if $field.TdStructField.IsList }}, list{{end -}}
   114  	{{- if $field.TdStructField.IsOmitEmpty }}, omitempty{{ end -}}
   115    ) — {{ $field.TdStructField.Help }}.{{end}}
   116  
   117  `))
   118  
   119  var eventTemplate = template.Must(template.New("markdownEvent").Parse(`
   120  ### "{{.Name}}"
   121  
   122  Event structure: [{{.EventStructStr}}](#{{.EventStructStr}})
   123  
   124  {{.Help}}
   125  
   126  ` +
   127  	"```" +
   128  	`
   129  {{.Example}}
   130  ` +
   131  	"```"))