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  }