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 }