Skip to content

Commit e649be5

Browse files
Fix Go lint errors (#228)
New linting checks fail on code that does string concatenation within a loop. This change uses strings.Builder for more efficient string construction. Signed-off-by: Mark S. Lewis <[email protected]>
1 parent efd2f78 commit e649be5

File tree

2 files changed

+48
-30
lines changed

2 files changed

+48
-30
lines changed

internal/policydsl/policydsl.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,40 +39,44 @@ var regexErr = regexp.MustCompile("^No parameter '([^']+)' found[.]$")
3939
// a stub function - it returns the same string as it's passed.
4040
// This will be evaluated by second/third passes to convert to a proto policy
4141
func outof(args ...interface{}) (interface{}, error) {
42-
toret := "outof("
43-
4442
if len(args) < 2 {
4543
return nil, fmt.Errorf("expected at least two arguments to NOutOf. Given %d", len(args))
4644
}
4745

46+
var result strings.Builder
47+
48+
result.WriteString("outof(")
49+
4850
arg0 := args[0]
4951
// govaluate treats all numbers as float64 only. But and/or may pass int/string. Allowing int/string for flexibility of caller
5052
if n, ok := arg0.(float64); ok {
51-
toret += strconv.Itoa(int(n))
53+
result.WriteString(strconv.Itoa(int(n)))
5254
} else if n, ok := arg0.(int); ok {
53-
toret += strconv.Itoa(n)
55+
result.WriteString(strconv.Itoa(n))
5456
} else if n, ok := arg0.(string); ok {
55-
toret += n
57+
result.WriteString(n)
5658
} else {
5759
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg0))
5860
}
5961

6062
for _, arg := range args[1:] {
61-
toret += ", "
63+
result.WriteString(", ")
6264

6365
switch t := arg.(type) {
6466
case string:
6567
if regex.MatchString(t) {
66-
toret += "'" + t + "'"
68+
result.WriteString("'" + t + "'")
6769
} else {
68-
toret += t
70+
result.WriteString(t)
6971
}
7072
default:
7173
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg))
7274
}
7375
}
7476

75-
return toret + ")", nil
77+
result.WriteString(")")
78+
79+
return result.String(), nil
7680
}
7781

7882
func and(args ...interface{}) (interface{}, error) {
@@ -195,26 +199,31 @@ func FromString(policy string) (*cb.SignaturePolicyEnvelope, error) {
195199
}
196200

197201
func firstPass(args ...interface{}) (interface{}, error) {
198-
toret := "outof(ID"
202+
var result strings.Builder
203+
204+
result.WriteString("outof(ID")
205+
199206
for _, arg := range args {
200-
toret += ", "
207+
result.WriteString(", ")
201208

202209
switch t := arg.(type) {
203210
case string:
204211
if regex.MatchString(t) {
205-
toret += "'" + t + "'"
212+
result.WriteString("'" + t + "'")
206213
} else {
207-
toret += t
214+
result.WriteString(t)
208215
}
209216
case float32:
210217
case float64:
211-
toret += strconv.Itoa(int(t))
218+
result.WriteString(strconv.Itoa(int(t)))
212219
default:
213220
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg))
214221
}
215222
}
216223

217-
return toret + ")", nil
224+
result.WriteString(")")
225+
226+
return result.String(), nil
218227
}
219228

220229
type context struct {

pkg/chaincode/signaturepolicy.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,40 +46,44 @@ var regexErr = regexp.MustCompile("^No parameter '([^']+)' found[.]$")
4646
// a stub function - it returns the same string as it's passed.
4747
// This will be evaluated by second/third passes to convert to a proto policy
4848
func outof(args ...interface{}) (interface{}, error) {
49-
toret := "outof("
50-
5149
if len(args) < 2 {
5250
return nil, fmt.Errorf("expected at least two arguments to NOutOf. Given %d", len(args))
5351
}
5452

53+
var result strings.Builder
54+
55+
result.WriteString("outof(")
56+
5557
arg0 := args[0]
5658
// govaluate treats all numbers as float64 only. But and/or may pass int/string. Allowing int/string for flexibility of caller
5759
if n, ok := arg0.(float64); ok {
58-
toret += strconv.Itoa(int(n))
60+
result.WriteString(strconv.Itoa(int(n)))
5961
} else if n, ok := arg0.(int); ok {
60-
toret += strconv.Itoa(n)
62+
result.WriteString(strconv.Itoa(n))
6163
} else if n, ok := arg0.(string); ok {
62-
toret += n
64+
result.WriteString(n)
6365
} else {
6466
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg0))
6567
}
6668

6769
for _, arg := range args[1:] {
68-
toret += ", "
70+
result.WriteString(", ")
6971

7072
switch t := arg.(type) {
7173
case string:
7274
if regex.MatchString(t) {
73-
toret += "'" + t + "'"
75+
result.WriteString("'" + t + "'")
7476
} else {
75-
toret += t
77+
result.WriteString(t)
7678
}
7779
default:
7880
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg))
7981
}
8082
}
8183

82-
return toret + ")", nil
84+
result.WriteString(")")
85+
86+
return result.String(), nil
8387
}
8488

8589
func and(args ...interface{}) (interface{}, error) {
@@ -93,26 +97,31 @@ func or(args ...interface{}) (interface{}, error) {
9397
}
9498

9599
func firstPass(args ...interface{}) (interface{}, error) {
96-
toret := "outof(ID"
100+
var result strings.Builder
101+
102+
result.WriteString("outof(ID")
103+
97104
for _, arg := range args {
98-
toret += ", "
105+
result.WriteString(", ")
99106

100107
switch t := arg.(type) {
101108
case string:
102109
if regex.MatchString(t) {
103-
toret += "'" + t + "'"
110+
result.WriteString("'" + t + "'")
104111
} else {
105-
toret += t
112+
result.WriteString(t)
106113
}
107114
case float32:
108115
case float64:
109-
toret += strconv.Itoa(int(t))
116+
result.WriteString(strconv.Itoa(int(t)))
110117
default:
111118
return nil, fmt.Errorf("unexpected type %s", reflect.TypeOf(arg))
112119
}
113120
}
114121

115-
return toret + ")", nil
122+
result.WriteString(")")
123+
124+
return result.String(), nil
116125
}
117126

118127
// signedBy creates a SignaturePolicy requiring a given signer's signature

0 commit comments

Comments
 (0)