github.com/frostornge/solgen@v0.1.3/proto/contract.go (about) 1 package proto 2 3 import ( 4 "fmt" 5 6 "github.com/frostornge/solgen/utils" 7 8 "github.com/ethereum/go-ethereum/accounts/abi" 9 ) 10 11 type contract struct { 12 PackageName string 13 Services []Service 14 Messages []message 15 16 contractName string 17 typeOptions Options 18 } 19 20 const EmptyMessage = "google.protobuf.Empty" 21 22 func (c *contract) parseMessage(name string, comment string, args abi.Arguments) { 23 msg := &message{ 24 Args: make([]argument, len(args)), 25 Comment: comment, 26 Name: name, 27 contractName: c.contractName, 28 typeOptions: c.typeOptions, 29 } 30 msg.parseArguments(args) 31 c.Messages = append(c.Messages, *msg) 32 } 33 34 func (c *contract) parseContract(contractAbi abi.ABI) { 35 service := Service{ 36 Comment: c.contractName, 37 Name: c.contractName, 38 Methods: make([]method, len(contractAbi.Methods)), 39 } 40 41 methodIndex := 0 42 for methodName, methodInfo := range contractAbi.Methods { 43 inputMessage := fmt.Sprintf("Request%s", utils.Capitalize(methodName)) 44 outputMessage := fmt.Sprintf("Response%s", utils.Capitalize(methodName)) 45 46 if len(methodInfo.Inputs) == 0 { 47 inputMessage = EmptyMessage 48 } else { 49 c.parseMessage(inputMessage, methodInfo.Sig(), methodInfo.Inputs) 50 } 51 52 if len(methodInfo.Outputs) == 0 { 53 outputMessage = EmptyMessage 54 } else { 55 c.parseMessage(outputMessage, methodInfo.Sig(), methodInfo.Outputs) 56 } 57 58 service.Methods[methodIndex] = method{ 59 Name: methodName, 60 Input: inputMessage, 61 Output: outputMessage, 62 } 63 64 methodIndex += 1 65 } 66 67 c.PackageName = utils.ToSnakeCase(c.contractName) 68 c.Services = []Service{service} 69 }