WIP
This commit is contained in:
parent
d794e43347
commit
430ce670b5
|
@ -0,0 +1,77 @@
|
|||
package edn
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var primitiveGoTypeToMalli = map[string]string{
|
||||
"bool": ":boolean",
|
||||
"string": ":string",
|
||||
"float64": ":double",
|
||||
"int": ":int",
|
||||
"int32": ":int",
|
||||
"uint8": ":int",
|
||||
"uint32": ":int",
|
||||
"uint64": ":int",
|
||||
}
|
||||
|
||||
func convertCamelToKebab(input string) string {
|
||||
re := regexp.MustCompile("([a-z])([A-Z])")
|
||||
kebab := re.ReplaceAllString(input, "${1}-${2}")
|
||||
return strings.ToLower(kebab)
|
||||
}
|
||||
|
||||
func handleType(fieldType reflect.Type) any {
|
||||
kind := fieldType.Kind()
|
||||
|
||||
if kind == reflect.Interface {
|
||||
return ":any"
|
||||
}
|
||||
|
||||
if kind == reflect.Struct {
|
||||
return ConvertStructToMalli(fieldType)
|
||||
}
|
||||
|
||||
if kind == reflect.Slice {
|
||||
elemType := fieldType.Elem()
|
||||
// Handle the type that the pointer points to.
|
||||
if elemType.Kind() == reflect.Ptr {
|
||||
return []any{handleType(elemType.Elem())}
|
||||
}
|
||||
return []any{handleType(elemType)}
|
||||
}
|
||||
|
||||
return primitiveGoTypeToMalli[kind.String()]
|
||||
}
|
||||
|
||||
func ConvertStructToMalli(typ reflect.Type) map[string]any {
|
||||
if typ.Kind() == reflect.Ptr {
|
||||
typ = typ.Elem() // Dereference if it's a pointer to a struct type
|
||||
}
|
||||
|
||||
if typ.Kind() != reflect.Struct {
|
||||
panic("ConvertStructToMalli expects a struct type or pointer to a struct type")
|
||||
}
|
||||
|
||||
malliSchema := make(map[string]any)
|
||||
for i := 0; i < typ.NumField(); i++ {
|
||||
field := typ.Field(i)
|
||||
fmt.Println(field)
|
||||
|
||||
if !field.IsExported() {
|
||||
continue
|
||||
}
|
||||
|
||||
kebabFieldName := convertCamelToKebab(field.Name)
|
||||
|
||||
if field.Type.Kind() == reflect.Ptr {
|
||||
malliSchema[kebabFieldName] = handleType(field.Type.Elem())
|
||||
} else {
|
||||
malliSchema[kebabFieldName] = handleType(field.Type)
|
||||
}
|
||||
}
|
||||
return malliSchema
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package edn
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
common "github.com/status-im/status-go/protocol/common"
|
||||
)
|
||||
|
||||
func TestConvertStructToMalli(t *testing.T) {
|
||||
malliRepresentation := ConvertStructToMalli(reflect.TypeOf(common.Message{}))
|
||||
bytes, err := json.MarshalIndent(malliRepresentation, "", " ")
|
||||
require.NoError(t, err)
|
||||
fmt.Println(string(bytes))
|
||||
}
|
Loading…
Reference in New Issue