|
@@ -20,12 +20,12 @@ type Map map[string]reflect.Kind
|
|
|
type Astruct struct {
|
|
|
|
|
|
|
|
|
- Use32Bit bool
|
|
|
- UseAny bool
|
|
|
- UseInterface bool
|
|
|
- VerboseLogging bool
|
|
|
- AssumeStruct bool
|
|
|
- PrefixStructName string
|
|
|
+ Use32Bit bool
|
|
|
+ UseAny bool
|
|
|
+ VerboseLogging bool
|
|
|
+ AssumeStruct bool
|
|
|
+ PrefixStructName string
|
|
|
+ SuffixForArrayLikes string
|
|
|
|
|
|
|
|
|
|
|
@@ -42,10 +42,10 @@ type Astruct struct {
|
|
|
func (A *Astruct) Defaults() {
|
|
|
A.Use32Bit = false
|
|
|
A.UseAny = true
|
|
|
- A.UseInterface = true
|
|
|
A.VerboseLogging = false
|
|
|
- A.AssumeStruct = false
|
|
|
+ A.AssumeStruct = true
|
|
|
A.PrefixStructName = ""
|
|
|
+ A.SuffixForArrayLikes = "Item"
|
|
|
A.Init()
|
|
|
}
|
|
|
|
|
@@ -128,8 +128,20 @@ func (A *Astruct) parse(at any, name string) error {
|
|
|
A.MapLikes[name][k] = reflect.TypeOf(v).Kind()
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
- A.MapLikes[name]["all"] = reflect.TypeOf(m[maps.Keys(m)[0]]).Kind()
|
|
|
+ } else {
|
|
|
+ A.MapLikes[name][""] = reflect.TypeOf(m[maps.Keys(m)[0]]).Kind()
|
|
|
+ for k, v := range m {
|
|
|
+ if reflect.TypeOf(v).Kind() == reflect.Float32 || reflect.TypeOf(v).Kind() == reflect.Float64 {
|
|
|
+ f := v.(float64)
|
|
|
+ if IsInt(f) {
|
|
|
+ A.MapLikes[name][k] = reflect.Int64
|
|
|
+ } else {
|
|
|
+ A.MapLikes[name][k] = reflect.Float64
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ A.MapLikes[name][k] = reflect.TypeOf(v).Kind()
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
case reflect.Array, reflect.Slice:
|
|
|
a := at.([]any)
|
|
@@ -147,14 +159,14 @@ func (A *Astruct) parse(at any, name string) error {
|
|
|
switch reflect.TypeOf(v).Kind() {
|
|
|
case reflect.Map:
|
|
|
A.Depth += 1
|
|
|
- err := A.parse(v, fmt.Sprint(i))
|
|
|
+ err := A.parse(v, A.SuffixForArrayLikes)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
A.Depth -= 1
|
|
|
case reflect.Array, reflect.Slice:
|
|
|
A.Depth += 1
|
|
|
- err := A.parse(v, fmt.Sprint(i))
|
|
|
+ err := A.parse(v, A.SuffixForArrayLikes)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -296,21 +308,25 @@ func (A *Astruct) WriteFile(filename, packageName string, permissions os.FileMod
|
|
|
|
|
|
var seen []string = []string{}
|
|
|
for name, m := range A.MapLikes {
|
|
|
- if name == "all" {
|
|
|
+
|
|
|
continue
|
|
|
- }
|
|
|
+ }*/
|
|
|
if slices.Contains(seen, name) {
|
|
|
continue
|
|
|
}
|
|
|
- if !A.AssumeStruct || !SameType(m) {
|
|
|
+ _, sameType := m[""]
|
|
|
+ if !A.AssumeStruct || !sameType {
|
|
|
fh.WriteString(fmt.Sprintf("type %s%s struct {\n", A.PrefixStructName, CamelCase(name)))
|
|
|
for k, v := range m {
|
|
|
if slices.Contains(maps.Keys(A.MapLikes), k) {
|
|
|
- if SameType(A.MapLikes[k]) {
|
|
|
- fh.WriteString(fmt.Sprintf("\t%s map[string]%s\n", CamelCase(k), A.MapLikes[k]["all"].String()))
|
|
|
+ _, sameType2 := A.MapLikes[k][""]
|
|
|
+ if sameType2 && !A.AssumeStruct {
|
|
|
+ fh.WriteString(fmt.Sprintf("\t%s map[string]%s\n", CamelCase(k), A.MapLikes[k][""].String()))
|
|
|
seen = append(seen, k)
|
|
|
- } else {
|
|
|
+ } else if !sameType2 || A.AssumeStruct && v == reflect.Map {
|
|
|
fh.WriteString(fmt.Sprintf("\t%s %s%s\n", CamelCase(k), A.PrefixStructName, CamelCase(k)))
|
|
|
+ } else if !sameType2 || A.AssumeStruct && v != reflect.Map {
|
|
|
+ fh.WriteString(fmt.Sprintf("\t%s %s\n", CamelCase(k), v.String()))
|
|
|
}
|
|
|
} else {
|
|
|
if slices.Contains(maps.Keys(A.ArrayLikes), k) {
|
|
@@ -322,21 +338,16 @@ func (A *Astruct) WriteFile(filename, packageName string, permissions os.FileMod
|
|
|
} else if a[0] == reflect.Int64 && A.Use32Bit {
|
|
|
fh.WriteString(fmt.Sprintf("\t%s []int32\n", CamelCase(k)))
|
|
|
continue
|
|
|
- } else if a[0] == reflect.Map && A.AssumeStruct {
|
|
|
- fh.WriteString(fmt.Sprintf("\t%s []%s\n", CamelCase(k), CamelCase(k)))
|
|
|
- continue
|
|
|
- } else if a[0] == reflect.Map && !A.AssumeStruct {
|
|
|
- fh.WriteString(fmt.Sprintf("\t%s []%s%d\n", CamelCase(k), CamelCase(k), 0))
|
|
|
+ } else if a[0] == reflect.Map {
|
|
|
+ fh.WriteString(fmt.Sprintf("\t%s []%s%s\n", CamelCase(k), CamelCase(k), A.SuffixForArrayLikes))
|
|
|
continue
|
|
|
}
|
|
|
fh.WriteString(fmt.Sprintf("\t%s []%s\n", CamelCase(k), a[0]))
|
|
|
} else {
|
|
|
|
|
|
|
|
|
- if A.UseAny && A.UseInterface {
|
|
|
+ if A.UseAny {
|
|
|
fh.WriteString(fmt.Sprintf("\t%s []any\n", CamelCase(k)))
|
|
|
- } else if !A.UseAny && A.UseInterface {
|
|
|
- fh.WriteString(fmt.Sprintf("\t%s []interface{}\n", CamelCase(k)))
|
|
|
} else {
|
|
|
return fmt.Errorf("astruct.Astruct.WriteFile(filename='%s', packageName='%s', permissions=%d) > Field '%s' is a slice, but it contains varying types (!UseAny, !UseInterface)", filename, packageName, permissions, k)
|
|
|
}
|
|
@@ -354,6 +365,24 @@ func (A *Astruct) WriteFile(filename, packageName string, permissions os.FileMod
|
|
|
}
|
|
|
}
|
|
|
fh.WriteString("}\n\n")
|
|
|
+ } else if A.AssumeStruct && sameType {
|
|
|
+ fh.WriteString(fmt.Sprintf("type %s%s struct {\n", A.PrefixStructName, CamelCase(name)))
|
|
|
+ t := m[""]
|
|
|
+ var kind reflect.Kind
|
|
|
+ if t == reflect.Float64 && A.Use32Bit {
|
|
|
+ kind = reflect.Float32
|
|
|
+ } else if t == reflect.Int64 && A.Use32Bit {
|
|
|
+ kind = reflect.Int32
|
|
|
+ } else {
|
|
|
+ kind = t
|
|
|
+ }
|
|
|
+ for k := range m {
|
|
|
+ if k == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ fh.WriteString(fmt.Sprintf("\t%s %s\n", CamelCase(k), kind))
|
|
|
+ }
|
|
|
+ fh.WriteString("}\n\n")
|
|
|
}
|
|
|
}
|
|
|
|