| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package main
- import (
- "fmt"
- "io"
- "sort"
- )
- func emitTypes(w io.Writer, schemas []Schema, aliases []Alias) error {
- if _, err := fmt.Fprintln(w, typesHeader); err != nil {
- return err
- }
- for _, a := range sortAliases(aliases) {
- if _, err := fmt.Fprintf(w, "export type %s = %s;\n", a.Name, tsTypeExpr(a.Underlying)); err != nil {
- return err
- }
- }
- if len(aliases) > 0 {
- if _, err := fmt.Fprintln(w); err != nil {
- return err
- }
- }
- for _, s := range sortSchemas(schemas) {
- if _, err := fmt.Fprintf(w, "export interface %s {\n", s.Name); err != nil {
- return err
- }
- fields := append([]Field(nil), s.Fields...)
- sort.SliceStable(fields, func(i, j int) bool { return fields[i].JSONName < fields[j].JSONName })
- for _, f := range fields {
- optional := ""
- if f.Optional {
- optional = "?"
- }
- line := fmt.Sprintf(" %s%s: %s;\n", quoteIfNeeded(f.JSONName), optional, tsTypeExpr(f.Type))
- if _, err := fmt.Fprint(w, line); err != nil {
- return err
- }
- }
- if _, err := fmt.Fprintln(w, "}"); err != nil {
- return err
- }
- if _, err := fmt.Fprintln(w); err != nil {
- return err
- }
- }
- return nil
- }
- func tsTypeExpr(t TypeRef) string {
- switch t.Kind {
- case KindString:
- return "string"
- case KindBool:
- return "boolean"
- case KindInt, KindNumber:
- return "number"
- case KindAny, KindUnknown, KindRaw:
- return "unknown"
- case KindArray:
- return tsTypeExpr(*t.Element) + "[]"
- case KindMap:
- return "Record<" + tsTypeExpr(*t.Key) + ", " + tsTypeExpr(*t.Value) + ">"
- case KindRef:
- if t.Name == "nullable" {
- return tsTypeExpr(*t.Inner) + " | null"
- }
- return t.Name
- }
- return "unknown"
- }
- const typesHeader = `// Code generated by tools/openapigen. DO NOT EDIT.`
|