diff --git a/field.go b/field.go index a638ca7..b590575 100644 --- a/field.go +++ b/field.go @@ -4,7 +4,6 @@ import ( "fmt" "go/ast" "io" - "log" "reflect" "strings" ) @@ -135,10 +134,9 @@ func (f *Field) setProps(sf reflect.StructField, sft reflect.Type) (ignore bool) return true } - if sf.Anonymous { - log.Println("anonymous structs aren't supported, yet.") - return true - } + // if sf.Anonymous { + // log.Println("anonymous:", sf.Name, sf.Type.Kind()) + // } var ( jsonTag = strings.Split(sf.Tag.Get("json"), ",") @@ -151,7 +149,6 @@ func (f *Field) setProps(sf reflect.StructField, sft reflect.Type) (ignore bool) if f.Name = sf.Name; len(jsonTag) > 0 && jsonTag[0] != "" { f.Name = jsonTag[0] - } f.IsDate = isDate(sft) || len(tsTag) > 0 && tsTag[0] == "date" || sft.Kind() == reflect.Int64 && strings.HasSuffix(f.Name, "TS") diff --git a/s2ts.go b/s2ts.go index f6370f7..6a58377 100644 --- a/s2ts.go +++ b/s2ts.go @@ -68,39 +68,15 @@ func (s *StructToTS) AddWithName(v interface{}, name string) *Struct { t = reflect.TypeOf(v) } - return s.addType(t, name, "") + return s.addType(t, name) } -func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct) { - t = indirect(t) - - if out = s.seen[t]; out != nil { - return out - } - - if name == "" { - name = t.Name() - if !s.opts.NoCapitalize { - name = capitalize(name) - } - } - - out = &Struct{ - Name: prefix + name, - Fields: make([]*Field, 0, t.NumField()), - - t: t, - } - - s.seen[t] = out - +func (s *StructToTS) addTypeFields(out *Struct, t reflect.Type) { for i := 0; i < t.NumField(); i++ { - var ( - sf = t.Field(i) - sft = sf.Type - tf Field - k = sft.Kind() - ) + sf := t.Field(i) + sft := sf.Type + k := sft.Kind() + var tf Field if k == reflect.Ptr { tf.CanBeNull = true @@ -112,13 +88,19 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct) continue } + if sf.Anonymous && k == reflect.Struct && !tf.IsDate { + // log.Println("trying anonymous field:", sft, k) + s.addTypeFields(out, sft) + continue + } + switch { case k == reflect.Map: tf.TsType, tf.KeyType, tf.ValType = "map", stripType(sft.Key()), stripType(sft.Elem()) switch { case isStruct(sft.Elem()): - tf.ValType = s.addType(sft.Elem(), "", out.Name).Name + tf.ValType = s.addType(sft.Elem(), "").Name case sft.Elem().Kind() == reflect.Interface: tf.ValType = "any" } @@ -127,15 +109,15 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct) tf.TsType, tf.ValType = "array", stripType(sft.Elem()) if isStruct(sft.Elem()) { - tf.ValType = s.addType(sft.Elem(), "", out.Name).Name + tf.ValType = s.addType(sft.Elem(), "").Name } case k == reflect.Struct: - if isDate(sft) { + if isDate(sft) || tf.IsDate { break } tf.TsType = "object" - tf.ValType = s.addType(sft, "", out.Name).Name + tf.ValType = s.addType(sft, "").Name case k == reflect.Interface: tf.TsType, tf.ValType = "object", "" @@ -147,8 +129,34 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct) out.Fields = append(out.Fields, &tf) } +} + +func (s *StructToTS) addType(t reflect.Type, name string) (out *Struct) { + t = indirect(t) + + if out = s.seen[t]; out != nil { + return out + } + + if name == "" { + name = t.Name() + if !s.opts.NoCapitalize { + name = capitalize(name) + } + } + out = &Struct{ + Name: name, + Fields: make([]*Field, 0, t.NumField()), + + t: t, + } + + // log.Println("building struct:", out.Name) + s.addTypeFields(out, t) + s.seen[t] = out s.structs = append(s.structs, out) + // log.Println("/building struct:", out.Name) return }