Skip to content

Commit 9f62672

Browse files
feat(devops): process interface struct
1 parent c84dd06 commit 9f62672

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

devops/internal/model/container.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -594,14 +594,14 @@ func ConvertCodeToValue(code string, schema *devmodel.JsonSchema, inputType refl
594594
if !ok {
595595
continue
596596
}
597-
result = parseCompositeLit(cl, schema)
597+
result = parseCompositeLit(cl, schema, "")
598598
case *ast.CompositeLit:
599599
if schema.Type == devmodel.JsonTypeOfArray {
600600
result = parseArrayLit(v, schema)
601601
} else if schema.Type == devmodel.JsonTypeOfObject && schema.AdditionalProperties != nil {
602602
result = parseMapLit(v, schema)
603603
} else {
604-
result = parseCompositeLit(v, schema)
604+
result = parseCompositeLit(v, schema, "schema.Message")
605605
}
606606
case *ast.BasicLit:
607607
result = parseBasicLit(v)
@@ -626,6 +626,12 @@ func ConvertCodeToValue(code string, schema *devmodel.JsonSchema, inputType refl
626626
})
627627

628628
val := reflect.New(inputType)
629+
if schema.Type == "interface" {
630+
implType, ok := GetRegisteredType("schema.Message")
631+
if ok {
632+
val = reflect.New(implType.Type)
633+
}
634+
}
629635

630636
if err := convertToValue(result, val.Elem()); err != nil {
631637
return reflect.Value{}, err
@@ -646,9 +652,9 @@ func parseCallExpr(call *ast.CallExpr) interface{} {
646652
return nil
647653
}
648654

649-
func parseCompositeLit(cl *ast.CompositeLit, schema *devmodel.JsonSchema) map[string]interface{} {
655+
func parseCompositeLit(cl *ast.CompositeLit, schema *devmodel.JsonSchema, identifier string) map[string]interface{} {
650656
data := make(map[string]interface{})
651-
fieldTagMap := buildFieldTagMap(schema)
657+
fieldTagMap := buildFieldTagMap(schema, identifier)
652658

653659
for _, elt := range cl.Elts {
654660
kv, ok := elt.(*ast.KeyValueExpr)
@@ -698,7 +704,7 @@ func parseExpr(expr ast.Expr, schema *devmodel.JsonSchema) interface{} {
698704
if schema.AdditionalProperties != nil {
699705
return parseMapLit(v, schema)
700706
}
701-
return parseCompositeLit(v, schema)
707+
return parseCompositeLit(v, schema, "")
702708
case devmodel.JsonTypeOfArray:
703709
return parseArrayLit(v, schema)
704710
default:
@@ -751,7 +757,7 @@ func parseMapLit(cl *ast.CompositeLit, schema *devmodel.JsonSchema) map[string]i
751757
} else if valueSchema.Type == devmodel.JsonTypeOfArray {
752758
value = parseArrayLit(v, valueSchema)
753759
} else {
754-
value = parseCompositeLit(v, valueSchema)
760+
value = parseCompositeLit(v, valueSchema, "")
755761
}
756762
default:
757763
value = parseExpr(kv.Value, valueSchema)
@@ -761,7 +767,15 @@ func parseMapLit(cl *ast.CompositeLit, schema *devmodel.JsonSchema) map[string]i
761767
return m
762768
}
763769

764-
func buildFieldTagMap(schema *devmodel.JsonSchema) map[string]*FieldInfo {
770+
func buildFieldTagMap(schema *devmodel.JsonSchema, identifier string) map[string]*FieldInfo {
771+
if schema.Type == "interface" {
772+
implType, ok := GetRegisteredType(identifier)
773+
if !ok {
774+
return nil
775+
}
776+
return buildFieldTagMap(implType.Schema, identifier)
777+
}
778+
765779
fieldTagMap := make(map[string]*FieldInfo)
766780
for jsonKey, propSchema := range schema.Properties {
767781
if propSchema.Description == "" {

devops/internal/model/types.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ var registeredTypes = []RegisteredType{
8989
//{Identifier: "*bool", Type: generic.TypeOf[*bool]()},
9090
}
9191

92+
func GetRegisteredType(identifier string) (*RegisteredType, bool) {
93+
for _, rt := range registeredTypes {
94+
if rt.Identifier == identifier {
95+
return &rt, true
96+
}
97+
}
98+
return nil, false
99+
}
100+
92101
func RegisterType(rt reflect.Type) {
93102
if _, ok := registeredTypeMap[rt.String()]; ok {
94103
return

0 commit comments

Comments
 (0)