@@ -43,26 +43,25 @@ func IsErrNoMatchedVar(err error) bool {
43
43
// Expand replaces all variables like {var} to match
44
44
func Expand (template string , match map [string ]string , subs ... string ) (string , error ) {
45
45
var (
46
- buf strings.Builder
47
- key strings.Builder
48
- enter bool
46
+ buf strings.Builder
47
+ keyStartPos = - 1
49
48
)
50
- for _ , c := range template {
49
+ for i , c := range template {
51
50
switch {
52
51
case c == '{' :
53
- if enter {
52
+ if keyStartPos > - 1 {
54
53
return "" , ErrWrongSyntax {
55
54
Template : template ,
56
55
}
57
56
}
58
- enter = true
57
+ keyStartPos = i
59
58
case c == '}' :
60
- if ! enter {
59
+ if keyStartPos == - 1 {
61
60
return "" , ErrWrongSyntax {
62
61
Template : template ,
63
62
}
64
63
}
65
- if key . Len () == 0 {
64
+ if i - keyStartPos <= 1 {
66
65
return "" , ErrWrongSyntax {
67
66
Template : template ,
68
67
}
@@ -71,16 +70,16 @@ func Expand(template string, match map[string]string, subs ...string) (string, e
71
70
if len (match ) == 0 {
72
71
return "" , ErrNoMatchedVar {
73
72
Template : template ,
74
- Var : key . String () ,
73
+ Var : template [ keyStartPos + 1 : i ] ,
75
74
}
76
75
}
77
76
78
- v , ok := match [key . String () ]
77
+ v , ok := match [template [ keyStartPos + 1 : i ] ]
79
78
if ! ok {
80
79
if len (subs ) == 0 {
81
80
return "" , ErrNoMatchedVar {
82
81
Template : template ,
83
- Var : key . String () ,
82
+ Var : template [ keyStartPos + 1 : i ] ,
84
83
}
85
84
}
86
85
v = subs [0 ]
@@ -89,13 +88,9 @@ func Expand(template string, match map[string]string, subs ...string) (string, e
89
88
if _ , err := buf .WriteString (v ); err != nil {
90
89
return "" , err
91
90
}
92
- key .Reset ()
93
91
94
- enter = false
95
- case enter :
96
- if _ , err := key .WriteRune (c ); err != nil {
97
- return "" , err
98
- }
92
+ keyStartPos = - 1
93
+ case keyStartPos > - 1 :
99
94
default :
100
95
if _ , err := buf .WriteRune (c ); err != nil {
101
96
return "" , err
0 commit comments