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 }