Skip to content

Commit

Permalink
events: Add variant support for vectors
Browse files Browse the repository at this point in the history
  • Loading branch information
cdamian committed Jan 17, 2023
1 parent 9b22346 commit d742d37
Showing 1 changed file with 64 additions and 33 deletions.
97 changes: 64 additions & 33 deletions events/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func parseFields(meta *types.Metadata, decoder *scale.Decoder, fields []types.Si
return nil, fmt.Errorf("type not found for field %s", field.Name)
}

fieldName := string(field.Name)
fieldName := getFieldName(field)

fieldTypeDef := fieldType.Def

Expand Down Expand Up @@ -158,37 +158,7 @@ func decodeTypeDef(meta *types.Metadata, decoder *scale.Decoder, typeDef types.S

return compositeFields, nil
case typeDef.IsVariant:
variantByte, err := decoder.ReadOneByte()

if err != nil {
return nil, fmt.Errorf("couldn't read variant byte: %w", err)
}

variantFound := false

for _, variant := range typeDef.Variant.Variants {
if byte(variant.Index) != variantByte {
continue
}

variantFound = true

if len(variant.Fields) == 0 {
return string(variant.Name), nil
}

variantFields, err := parseFields(meta, decoder, variant.Fields)

if err != nil {
return nil, fmt.Errorf("couldn't parse variant fields: %w", err)
}

return variantFields, nil
}

if !variantFound {
return nil, fmt.Errorf("variant %d not found", variantByte)
}
return decodeVariant(meta, decoder, typeDef)
case typeDef.IsPrimitive:
primitiveValue, err := decodePrimitive(decoder, typeDef.Primitive.Si0TypeDefPrimitive)

Expand Down Expand Up @@ -278,6 +248,26 @@ func decodeTypeDef(meta *types.Metadata, decoder *scale.Decoder, typeDef types.S
}

return compositeVector, nil
case vectorFieldType.Def.IsVariant:
vectorLen, err := decoder.DecodeUintCompact()

if err != nil {
return nil, fmt.Errorf("couldn't decode vector length: %w", err)
}

var variantVector []any

for i := uint64(0); i < vectorLen.Uint64(); i++ {
variant, err := decodeVariant(meta, decoder, vectorFieldType.Def)

if err != nil {
return nil, fmt.Errorf("couldn't parse composite vector fields: %w", err)
}

variantVector = append(variantVector, variant)
}

return variantVector, nil
default:
return nil, errors.New("unsupported vector field type definition")
}
Expand All @@ -296,8 +286,38 @@ func decodeTypeDef(meta *types.Metadata, decoder *scale.Decoder, typeDef types.S
default:
return nil, errors.New("unsupported field type definition")
}
}

func decodeVariant(meta *types.Metadata, decoder *scale.Decoder, typeDef types.Si1TypeDef) (any, error) {
variantByte, err := decoder.ReadOneByte()

if err != nil {
return nil, fmt.Errorf("couldn't read variant byte: %w", err)
}

for _, variant := range typeDef.Variant.Variants {
if byte(variant.Index) != variantByte {
continue
}

if len(variant.Fields) == 0 {
return string(variant.Name), nil
}

fieldMap := make(map[string]any)

variantFields, err := parseFields(meta, decoder, variant.Fields)

if err != nil {
return nil, fmt.Errorf("couldn't parse variant fields: %w", err)
}

fieldMap[string(variant.Name)] = variantFields

return fieldMap, nil
}

return nil, fmt.Errorf("unsupported type definition %v", typeDef)
return nil, fmt.Errorf("variant %d not found", variantByte)
}

func decodeCompact(meta *types.Metadata, decoder *scale.Decoder, typeDef types.Si1TypeDef) (any, error) {
Expand Down Expand Up @@ -508,3 +528,14 @@ func decode[T any](decoder *scale.Decoder) (T, error) {

return t, nil
}

func getFieldName(field types.Si1Field) string {
switch {
case field.HasName:
return string(field.Name)
case field.HasTypeName:
return string(field.TypeName)
default:
return "unknown_field_name"
}
}

0 comments on commit d742d37

Please sign in to comment.