github.com/frostornge/solgen@v0.1.3/proto/types.go (about)

     1  package proto
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  
     7  	"github.com/frostornge/solgen/utils"
     8  
     9  	"github.com/ethereum/go-ethereum/accounts/abi"
    10  )
    11  
    12  const StructPrefix = "XYX__tmp"
    13  
    14  func parseType(index int, a abi.Argument, typeOptions map[string]string) (msg *message, arg *argument) {
    15  	argName := utils.Decapitalise(parseName(index, a))
    16  	argType := a.Type
    17  
    18  	repeated := argType.T == abi.ArrayTy || argType.T == abi.SliceTy
    19  
    20  	arg = &argument{
    21  		Count:    index,
    22  		Name:     argName,
    23  		Repeated: repeated,
    24  		Type:     parseSimpleType(argType),
    25  	}
    26  
    27  	if arg.Type == "struct" {
    28  		msg = &message{
    29  			Args:    make([]argument, len(argType.TupleElems)),
    30  			Comment: argType.Type.String(),
    31  			Name:    StructPrefix + utils.Capitalize(argType.Kind.String()) + strconv.Itoa(index),
    32  		}
    33  
    34  		if !strings.HasPrefix(argName, "struct") {
    35  			arg.Name = utils.Decapitalise(argName)
    36  			msg.Name = utils.Capitalize(argName)
    37  		}
    38  
    39  		if name, ok := typeOptions[argType.String()]; ok {
    40  			arg.Name = utils.Decapitalise(name)
    41  			msg.Name = utils.Capitalize(name)
    42  		}
    43  
    44  		args := make([]abi.Argument, len(argType.TupleElems))
    45  		for index := range argType.TupleElems {
    46  			args[index] = abi.Argument{
    47  				Name: argType.TupleRawNames[index],
    48  				Type: *argType.TupleElems[index],
    49  			}
    50  		}
    51  
    52  		msg.parseArguments(args)
    53  		arg.Type = msg.Name
    54  	}
    55  
    56  	return
    57  }
    58  
    59  func parseSimpleType(t abi.Type) string {
    60  	switch t.T {
    61  	case abi.IntTy:
    62  		if t.Size <= 32 {
    63  			return "int32"
    64  		} else if t.Size <= 64 {
    65  			return "int64"
    66  		}
    67  	case abi.UintTy:
    68  		if t.Size <= 32 {
    69  			return "uint32"
    70  		} else if t.Size <= 64 {
    71  			return "uint64"
    72  		}
    73  	case abi.BoolTy:
    74  		return "bool"
    75  	case abi.StringTy:
    76  	case abi.SliceTy:
    77  	case abi.ArrayTy:
    78  	case abi.AddressTy:
    79  	case abi.TupleTy:
    80  		return "struct"
    81  	case abi.FixedBytesTy:
    82  	case abi.BytesTy:
    83  	case abi.HashTy:
    84  	case abi.FixedPointTy:
    85  	case abi.FunctionTy:
    86  	}
    87  	return "string"
    88  }
    89  
    90  func parseName(index int, arg abi.Argument) string {
    91  	argName := arg.Name
    92  	argType := arg.Type.Kind.String()
    93  
    94  	switch argName {
    95  	case "":
    96  		return argType + strconv.Itoa(index)
    97  	default:
    98  		return argName
    99  	}
   100  }