From 625eca27f6bc9d5a8a1b0eb47437c0b7fc469057 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 5 Apr 2022 18:11:56 +1000 Subject: [PATCH] Feature: TS namespaces --- v2/internal/binding/binding.go | 36 ++++++++++++++++++++++ v2/internal/typescriptify/typescriptify.go | 28 ++++++++++++----- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/v2/internal/binding/binding.go b/v2/internal/binding/binding.go index 010e43d64..27e0045f1 100755 --- a/v2/internal/binding/binding.go +++ b/v2/internal/binding/binding.go @@ -87,6 +87,7 @@ func (b *Bindings) WriteModels(modelsDir string) error { thisPackageCode := "" for _, structInterface := range structsToGenerate { w := typescriptify.New() + w.Namespace = packageName w.WithBackupDir("") w.Add(structInterface) str, err := w.Convert(nil) @@ -121,5 +122,40 @@ func (b *Bindings) AddStructToGenerateTS(packageName string, structName string, if b.structsToGenerateTS[packageName] == nil { b.structsToGenerateTS[packageName] = make(map[string]interface{}) } + if b.structsToGenerateTS[packageName][structName] != nil { + return + } b.structsToGenerateTS[packageName][structName] = s + + // Iterate this struct and add any struct field references + structType := reflect.TypeOf(s) + if structType.Kind() == reflect.Ptr { + structType = structType.Elem() + } + + for i := 0; i < structType.NumField(); i++ { + field := structType.Field(i) + if field.Anonymous { + return + } + + kind := field.Type.Kind() + if kind == reflect.Struct { + fqname := field.Type.String() + sName := strings.Split(fqname, ".")[1] + pName := getPackageName(fqname) + a := reflect.New(field.Type) + s := reflect.Indirect(a).Interface() + b.AddStructToGenerateTS(pName, sName, s) + } else if kind == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { + fqname := field.Type.String() + sName := strings.Split(fqname, ".")[1] + pName := getPackageName(fqname) + typ := field.Type.Elem() + a := reflect.New(typ) + s := reflect.Indirect(a).Interface() + b.AddStructToGenerateTS(pName, sName, s) + } + } + } diff --git a/v2/internal/typescriptify/typescriptify.go b/v2/internal/typescriptify/typescriptify.go index 8b55093b3..7b49c7101 100644 --- a/v2/internal/typescriptify/typescriptify.go +++ b/v2/internal/typescriptify/typescriptify.go @@ -96,6 +96,8 @@ type TypeScriptify struct { // throwaway, used when converting alreadyConverted map[reflect.Type]bool + + Namespace string } func New() *TypeScriptify { @@ -554,6 +556,12 @@ func (t *TypeScriptify) convertType(depth int, typeOf reflect.Type, customCode m return "", nil } t.logf(depth, "Converting type %s", typeOf.String()) + if strings.ContainsRune(typeOf.String(), '.') { + namespace := strings.Split(typeOf.String(), ".")[0] + if namespace != t.Namespace { + return "", nil + } + } t.alreadyConverted[typeOf] = true @@ -568,10 +576,11 @@ func (t *TypeScriptify) convertType(depth int, typeOf reflect.Type, customCode m result = "export " + result } builder := typeScriptClassBuilder{ - types: t.kinds, - indent: t.Indent, - prefix: t.Prefix, - suffix: t.Suffix, + types: t.kinds, + indent: t.Indent, + prefix: t.Prefix, + suffix: t.Suffix, + namespace: t.Namespace, } fields := deepFields(typeOf) @@ -731,6 +740,7 @@ type typeScriptClassBuilder struct { createFromMethodBody []string constructorBody []string prefix, suffix string + namespace string } func (t *typeScriptClassBuilder) AddSimpleArrayField(fieldName string, field reflect.StructField, arrayDepth int, opts TypeOptions) error { @@ -785,10 +795,14 @@ func (t *typeScriptClassBuilder) AddEnumField(fieldName string, field reflect.St } func (t *typeScriptClassBuilder) AddStructField(fieldName string, field reflect.StructField) { - fieldType := field.Type.Name() strippedFieldName := strings.ReplaceAll(fieldName, "?", "") - t.addField(fieldName, t.prefix+fieldType+t.suffix) - t.addInitializerFieldLine(strippedFieldName, fmt.Sprintf("this.convertValues(source[\"%s\"], %s)", strippedFieldName, t.prefix+fieldType+t.suffix)) + namespace := strings.Split(field.Type.String(), ".")[0] + fqname := field.Type.Name() + if namespace != t.namespace { + fqname = field.Type.String() + } + t.addField(fieldName, fqname) + t.addInitializerFieldLine(strippedFieldName, fmt.Sprintf("this.convertValues(source[\"%s\"], %s)", strippedFieldName, fqname)) } func (t *typeScriptClassBuilder) AddArrayOfStructsField(fieldName string, field reflect.StructField, arrayDepth int) {