-
Notifications
You must be signed in to change notification settings - Fork 0
/
callArgsParser.go
62 lines (48 loc) · 1.33 KB
/
callArgsParser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package parsers
type callArgsParser struct {
}
// NewCallArgsParser creates a new parser
func NewCallArgsParser() *callArgsParser {
return &callArgsParser{}
}
// ParseData parses strings of the following format:
// functionRaw@argFooHex@argBarHex...
func (parser *callArgsParser) ParseData(data string) (string, [][]byte, error) {
var function string
var arguments [][]byte
tokens, err := tokenize(data)
if err != nil {
return "", nil, err
}
function, err = parser.parseFunction(tokens)
if err != nil {
return "", nil, err
}
arguments, err = parser.parseArguments(tokens)
if err != nil {
return "", nil, err
}
return function, arguments, nil
}
func (parser *callArgsParser) parseFunction(tokens []string) (string, error) {
if len(tokens) < minNumCallArguments {
return "", ErrNilFunction
}
function := string(tokens[indexOfFunction])
return function, nil
}
func (parser *callArgsParser) parseArguments(tokens []string) ([][]byte, error) {
arguments := make([][]byte, 0)
for i := minNumCallArguments; i < len(tokens); i++ {
argument, err := decodeToken(tokens[i])
if err != nil {
return nil, err
}
arguments = append(arguments, argument)
}
return arguments, nil
}
// IsInterfaceNil returns true if there is no value under the interface
func (parser *callArgsParser) IsInterfaceNil() bool {
return parser == nil
}