(rtype reflect.Type, tsTypesMap map[reflect.Type]string, embedded bool)
| 182 | } |
| 183 | |
| 184 | func generateTSTypeInternal(rtype reflect.Type, tsTypesMap map[reflect.Type]string, embedded bool) (string, []reflect.Type) { |
| 185 | var buf bytes.Buffer |
| 186 | tsTypeName := rtype.Name() |
| 187 | if tsRename, ok := tsRenameMap[tsTypeName]; ok { |
| 188 | tsTypeName = tsRename |
| 189 | } |
| 190 | var isWaveObj bool |
| 191 | if !embedded { |
| 192 | if rtype.Implements(waveObjRType) || reflect.PointerTo(rtype).Implements(waveObjRType) { |
| 193 | isWaveObj = true |
| 194 | } |
| 195 | } |
| 196 | var fieldsBuf bytes.Buffer |
| 197 | var subTypes []reflect.Type |
| 198 | for i := 0; i < rtype.NumField(); i++ { |
| 199 | field := rtype.Field(i) |
| 200 | if field.PkgPath != "" { |
| 201 | continue |
| 202 | } |
| 203 | if field.Anonymous { |
| 204 | embeddedBuf, embeddedTypes := generateTSTypeInternal(field.Type, tsTypesMap, true) |
| 205 | fieldsBuf.WriteString(embeddedBuf) |
| 206 | subTypes = append(subTypes, embeddedTypes...) |
| 207 | continue |
| 208 | } |
| 209 | fieldName := getTSFieldName(field) |
| 210 | if fieldName == "" { |
| 211 | continue |
| 212 | } |
| 213 | if isWaveObj && (fieldName == waveobj.OTypeKeyName || fieldName == waveobj.OIDKeyName || fieldName == waveobj.VersionKeyName || fieldName == waveobj.MetaKeyName) { |
| 214 | continue |
| 215 | } |
| 216 | optMarker := "" |
| 217 | if isFieldOmitEmpty(field) { |
| 218 | optMarker = "?" |
| 219 | } |
| 220 | tsTypeTag := field.Tag.Get("tstype") |
| 221 | if tsTypeTag != "" { |
| 222 | if tsTypeTag == "-" { |
| 223 | continue |
| 224 | } |
| 225 | fieldsBuf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsTypeTag)) |
| 226 | continue |
| 227 | } |
| 228 | tsType, fieldSubTypes := TypeToTSType(field.Type, tsTypesMap) |
| 229 | if tsType == "" { |
| 230 | continue |
| 231 | } |
| 232 | subTypes = append(subTypes, fieldSubTypes...) |
| 233 | if tsType == "UIContext" { |
| 234 | optMarker = "?" |
| 235 | } |
| 236 | fieldsBuf.WriteString(fmt.Sprintf(" %s%s: %s;\n", fieldName, optMarker, tsType)) |
| 237 | } |
| 238 | if !embedded { |
| 239 | buf.WriteString(fmt.Sprintf("// %s\n", rtype.String())) |
| 240 | if fieldsBuf.Len() == 0 && !isWaveObj { |
| 241 | // empty struct - use "object" instead of "{}" to satisfy linter |
no test coverage detected