Skip to content

Commit

Permalink
Merge pull request #13 from multiversx/composite-part-4
Browse files Browse the repository at this point in the history
Move structs from "valuesMulti" and "valuesSingle". Merge input & output
  • Loading branch information
andreibancioiu committed May 30, 2024
2 parents b9d983c + a794e5e commit 32ae587
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 205 deletions.
7 changes: 7 additions & 0 deletions abi/field.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package abi

// Field is a field in a struct, enum etc.
type Field struct {
Name string
Value SingleValue
}
17 changes: 17 additions & 0 deletions abi/multiValues.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package abi

// MultiValue is a multi-value
type MultiValue struct {
Items []any
}

// VariadicValues holds variadic values
type VariadicValues struct {
Items []any
ItemCreator func() any
}

// OptionalValue holds an optional value
type OptionalValue struct {
Value any
}
87 changes: 20 additions & 67 deletions abi/serializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package abi
import (
"encoding/hex"
"errors"
"fmt"
"strings"
)

Expand Down Expand Up @@ -62,23 +63,25 @@ func (s *serializer) doSerialize(partsHolder *partsHolder, inputValues []any) er
}

switch value := value.(type) {
case InputOptionalValue:
case *OptionalValue:
if i != len(inputValues)-1 {
// Usage of multiple optional values is not recommended:
// https://docs.multiversx.com/developers/data/multi-values
// Thus, here, we disallow them.
return errors.New("an optional value must be last among input values")
}

err = s.serializeInputOptionalValue(partsHolder, value)
case InputMultiValue:
err = s.serializeInputMultiValue(partsHolder, value)
case InputVariadicValues:
if value.Value != nil {
err = s.doSerialize(partsHolder, []any{value.Value})
}
case *MultiValue:
err = s.doSerialize(partsHolder, value.Items)
case *VariadicValues:
if i != len(inputValues)-1 {
return errors.New("variadic values must be last among input values")
}

err = s.serializeInputVariadicValues(partsHolder, value)
err = s.doSerialize(partsHolder, value.Items)
case SingleValue:
partsHolder.appendEmptyPart()
err = s.serializeSingleValue(partsHolder, value)
Expand Down Expand Up @@ -124,22 +127,27 @@ func (s *serializer) doDeserialize(partsHolder *partsHolder, outputValues []any)
}

switch value := value.(type) {
case *OutputOptionalValue:
case *OptionalValue:
if i != len(outputValues)-1 {
// Usage of multiple optional values is not recommended:
// https://docs.multiversx.com/developers/data/multi-values
// Thus, here, we disallow them.
return errors.New("an optional value must be last among output values")
}

err = s.deserializeOutputOptionalValue(partsHolder, value)
case *OutputMultiValue:
err = s.deserializeOutputMultiValue(partsHolder, value)
case *OutputVariadicValues:
if partsHolder.isFocusedBeyondLastPart() {
value.Value = nil
} else {
err = s.doDeserialize(partsHolder, []any{value.Value})
}
case *MultiValue:
err = s.doDeserialize(partsHolder, value.Items)
case *VariadicValues:
if i != len(outputValues)-1 {
return errors.New("variadic values must be last among output values")
}

err = s.deserializeVariadicValues(partsHolder, value)
case SingleValue:
err = s.deserializeSingleValue(partsHolder, value)
default:
Expand All @@ -154,36 +162,6 @@ func (s *serializer) doDeserialize(partsHolder *partsHolder, outputValues []any)
return nil
}

func (s *serializer) serializeInputOptionalValue(partsHolder *partsHolder, value InputOptionalValue) error {
if value.Value == nil {
return nil
}

return s.doSerialize(partsHolder, []any{value.Value})
}

func (s *serializer) serializeInputMultiValue(partsHolder *partsHolder, value InputMultiValue) error {
for _, item := range value.Items {
err := s.doSerialize(partsHolder, []any{item})
if err != nil {
return err
}
}

return nil
}

func (s *serializer) serializeInputVariadicValues(partsHolder *partsHolder, value InputVariadicValues) error {
for _, item := range value.Items {
err := s.doSerialize(partsHolder, []any{item})
if err != nil {
return err
}
}

return nil
}

func (s *serializer) serializeSingleValue(partsHolder *partsHolder, value SingleValue) error {
data, err := s.codec.EncodeTopLevel(value)
if err != nil {
Expand All @@ -193,32 +171,7 @@ func (s *serializer) serializeSingleValue(partsHolder *partsHolder, value Single
return partsHolder.appendToLastPart(data)
}

func (s *serializer) deserializeOutputOptionalValue(partsHolder *partsHolder, value *OutputOptionalValue) error {
for partsHolder.isFocusedBeyondLastPart() {
value.Value = nil
return nil
}

err := s.doDeserialize(partsHolder, []any{value.Value})
if err != nil {
return err
}

return nil
}

func (s *serializer) deserializeOutputMultiValue(partsHolder *partsHolder, value *OutputMultiValue) error {
for _, item := range value.Items {
err := s.doDeserialize(partsHolder, []any{item})
if err != nil {
return err
}
}

return nil
}

func (s *serializer) deserializeOutputVariadicValues(partsHolder *partsHolder, value *OutputVariadicValues) error {
func (s *serializer) deserializeVariadicValues(partsHolder *partsHolder, value *VariadicValues) error {
if value.ItemCreator == nil {
return errors.New("cannot deserialize variadic values: item creator is nil")
}
Expand Down
32 changes: 0 additions & 32 deletions abi/valuesMulti.go

This file was deleted.

106 changes: 0 additions & 106 deletions abi/valuesSingle.go

This file was deleted.

0 comments on commit 32ae587

Please sign in to comment.