github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/gen/typescript/funcmap.go (about)

     1  package typescript
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/webrpc/webrpc/schema"
     9  )
    10  
    11  var fieldTypeMap = map[schema.DataType]string{
    12  	schema.T_Uint:      "number",
    13  	schema.T_Uint8:     "number",
    14  	schema.T_Uint16:    "number",
    15  	schema.T_Uint32:    "number",
    16  	schema.T_Uint64:    "number",
    17  	schema.T_Int:       "number",
    18  	schema.T_Int8:      "number",
    19  	schema.T_Int16:     "number",
    20  	schema.T_Int32:     "number",
    21  	schema.T_Int64:     "number",
    22  	schema.T_Float32:   "number",
    23  	schema.T_Float64:   "number",
    24  	schema.T_String:    "string",
    25  	schema.T_Timestamp: "string",
    26  	schema.T_Null:      "null",
    27  	schema.T_Any:       "any",
    28  	schema.T_Byte:      "string",
    29  	schema.T_Bool:      "boolean",
    30  }
    31  
    32  func jsFieldType(in *schema.VarType) (string, error) {
    33  	switch in.Type {
    34  	case schema.T_Map:
    35  		return "object", nil
    36  
    37  	case schema.T_List:
    38  		z, err := fieldType(in.List.Elem)
    39  
    40  		if err != nil {
    41  			return "", err
    42  		}
    43  
    44  		return z + "[]", nil
    45  
    46  	case schema.T_Struct:
    47  		return in.Struct.Name, nil
    48  
    49  	case schema.T_UserDefined:
    50  		return in.UserDefined.Name, nil
    51  
    52  	default:
    53  		if fieldTypeMap[in.Type] != "" {
    54  			return fieldTypeMap[in.Type], nil
    55  		}
    56  	}
    57  
    58  	return "", fmt.Errorf("could not represent type: %#v", in)
    59  }
    60  
    61  func fieldType(in *schema.VarType) (string, error) {
    62  	switch in.Type {
    63  	case schema.T_Map:
    64  		typK, ok := fieldTypeMap[in.Map.Key]
    65  		if !ok {
    66  			return "", fmt.Errorf("unknown type mapping %v", in.Map.Key)
    67  		}
    68  		typV, err := fieldType(in.Map.Value)
    69  		if err != nil {
    70  			return "", err
    71  		}
    72  		return fmt.Sprintf("{[key: %s]: %s}", typK, typV), nil
    73  
    74  	case schema.T_List:
    75  		z, err := fieldType(in.List.Elem)
    76  		if err != nil {
    77  			return "", err
    78  		}
    79  		return "Array<" + z + ">", nil
    80  
    81  	case schema.T_Struct:
    82  		return in.Struct.Name, nil
    83  
    84  	case schema.T_UserDefined:
    85  		return in.UserDefined.Name, nil
    86  
    87  	default:
    88  		if fieldTypeMap[in.Type] != "" {
    89  			return fieldTypeMap[in.Type], nil
    90  		}
    91  	}
    92  	return "", fmt.Errorf("could not represent type: %#v", in)
    93  }
    94  
    95  func constPathPrefix(in schema.VarName) (string, error) {
    96  	return string(in) + "PathPrefix", nil
    97  }
    98  
    99  func methodInputName(in *schema.MethodArgument) string {
   100  	name := string(in.Name)
   101  	if name != "" {
   102  		return name
   103  	}
   104  	if in.Type != nil {
   105  		return in.Type.String()
   106  	}
   107  	return ""
   108  }
   109  
   110  func methodInputType(in *schema.MethodArgument) string {
   111  	z, _ := fieldType(in.Type)
   112  	return z
   113  }
   114  
   115  func methodArgumentInputInterfaceName(in *schema.Method) string {
   116  	// Commented to make it work for typescript
   117  	// if len(in.Service.Schema.Services) == 1 {
   118  	// 	return fmt.Sprintf("%s%s", in.Name, "Args")
   119  	// } else {
   120  	// 	return fmt.Sprintf("%s%s%s", in.Service.Name, in.Name, "Args")
   121  	// }
   122  	return fmt.Sprintf("%s%s", in.Name, "Args")
   123  }
   124  
   125  func methodArgumentOutputInterfaceName(in *schema.Method) string {
   126  	// Commented to make it work for typescript
   127  	// if len(in.Service.Schema.Services) == 1 {
   128  	// 	return fmt.Sprintf("%s%s", in.Name, "Return")
   129  	// } else {
   130  	// 	return fmt.Sprintf("%s%s%s", in.Service.Name, in.Name, "Return")
   131  	// }
   132  	return fmt.Sprintf("%s%s", in.Name, "Return")
   133  }
   134  
   135  func methodInputs(in *schema.Method) (string, error) {
   136  	inputs := []string{}
   137  	if len(in.Inputs) > 0 {
   138  		inputs = append(inputs, fmt.Sprintf("args: %s", methodArgumentInputInterfaceName(in)))
   139  	}
   140  	inputs = append(inputs, "headers?: object")
   141  	return strings.Join(inputs, ", "), nil
   142  }
   143  
   144  func methodOutputs(in *schema.Method) (string, error) {
   145  	return fmt.Sprintf("Promise<%s>", methodArgumentOutputInterfaceName(in)), nil
   146  }
   147  
   148  func methodName(in interface{}) string {
   149  	v, _ := downcaseName(in)
   150  	return v
   151  }
   152  
   153  func isStruct(t schema.MessageType) bool {
   154  	return t == "struct"
   155  }
   156  
   157  func isAdvancedType(t schema.MessageType) bool {
   158  	return t == "advance"
   159  }
   160  
   161  func exportedField(in schema.VarName) (string, error) {
   162  	return string(in), nil
   163  }
   164  
   165  func exportableField(in schema.MessageField) bool {
   166  	for _, meta := range in.Meta {
   167  		for k := range meta {
   168  			if k == "json" {
   169  				if meta[k] == "-" {
   170  					return false
   171  				}
   172  			}
   173  		}
   174  	}
   175  	return true
   176  }
   177  
   178  func exportedJSONField(in schema.MessageField) (string, error) {
   179  	for _, meta := range in.Meta {
   180  		for k := range meta {
   181  			if k == "json" {
   182  				s := strings.Split(fmt.Sprintf("%v", meta[k]), ",")
   183  				return s[0], nil
   184  			}
   185  		}
   186  	}
   187  	return string(in.Name), nil
   188  }
   189  
   190  func interfaceName(in schema.VarName) (string, error) {
   191  	s := string(in)
   192  	return s, nil
   193  }
   194  
   195  func isEnum(t schema.MessageType) bool {
   196  	return t == "enum"
   197  }
   198  
   199  func downcaseName(v interface{}) (string, error) {
   200  	downFn := func(s string) string {
   201  		if s == "" {
   202  			return ""
   203  		}
   204  		return strings.ToLower(s[0:1]) + s[1:]
   205  	}
   206  	switch t := v.(type) {
   207  	case schema.VarName:
   208  		return downFn(string(t)), nil
   209  	case string:
   210  		return downFn(t), nil
   211  	default:
   212  		return "", errors.New("downcaseFieldName, unknown arg type")
   213  	}
   214  }
   215  
   216  func listComma(item int, count int) string {
   217  	if item+1 < count {
   218  		return ", "
   219  	}
   220  	return ""
   221  }
   222  
   223  func serviceInterfaceName(in schema.VarName) (string, error) {
   224  	s := string(in)
   225  	return s, nil
   226  }
   227  
   228  func newOutputArgResponse(in *schema.MethodArgument) (string, error) {
   229  	z, err := fieldType(in.Type)
   230  	if err != nil {
   231  		return "", err
   232  	}
   233  
   234  	typ := fmt.Sprintf("<%s>", z)
   235  	line := fmt.Sprintf("%s: %s(_data.%s)", in.Name, typ, in.Name)
   236  
   237  	return line, nil
   238  }
   239  
   240  func serverServiceName(in schema.VarName) (string, error) {
   241  	s := string(in)
   242  	return strings.ToLower(s[0:1]) + s[1:] + "Server", nil
   243  }
   244  
   245  func methodArgType(in *schema.MethodArgument) string {
   246  	z, err := fieldType(in.Type)
   247  
   248  	if err != nil {
   249  		panic(err.Error())
   250  	}
   251  
   252  	var prefix string
   253  	typ := in.Type.Type
   254  
   255  	if in.Optional {
   256  		prefix = "*"
   257  	}
   258  	if typ == schema.T_Struct {
   259  		prefix = "" // noop, as already pointer applied elsewhere
   260  	}
   261  	if typ == schema.T_List || typ == schema.T_Map {
   262  		prefix = ""
   263  	}
   264  
   265  	return prefix + z
   266  }
   267  
   268  var templateFuncMap = map[string]interface{}{
   269  	"fieldType":                         fieldType,
   270  	"constPathPrefix":                   constPathPrefix,
   271  	"interfaceName":                     interfaceName,
   272  	"methodName":                        methodName,
   273  	"methodInputs":                      methodInputs,
   274  	"methodOutputs":                     methodOutputs,
   275  	"methodArgumentInputInterfaceName":  methodArgumentInputInterfaceName,
   276  	"methodArgumentOutputInterfaceName": methodArgumentOutputInterfaceName,
   277  	"isStruct":                          isStruct,
   278  	"isEnum":                            isEnum,
   279  	"listComma":                         listComma,
   280  	"serviceInterfaceName":              serviceInterfaceName,
   281  	"exportableField":                   exportableField,
   282  	"exportedField":                     exportedField,
   283  	"exportedJSONField":                 exportedJSONField,
   284  	"newOutputArgResponse":              newOutputArgResponse,
   285  	"downcaseName":                      downcaseName,
   286  	"isAdvancedType":                    isAdvancedType,
   287  	"serverServiceName":                 serverServiceName,
   288  	"methodArgType":                     methodArgType,
   289  	"jsFieldType":                       jsFieldType,
   290  }