forked from projectdiscovery/nuclei
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreplacer.go
44 lines (37 loc) · 1.57 KB
/
replacer.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
package replacer
import (
"strings"
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/marker"
"github.com/projectdiscovery/nuclei/v2/pkg/types"
)
// Replace replaces placeholders in template with values on the fly.
func Replace(template string, values map[string]interface{}) string {
var replacerItems []string
builder := &strings.Builder{}
for key, val := range values {
builder.WriteString(marker.ParenthesisOpen)
builder.WriteString(key)
builder.WriteString(marker.ParenthesisClose)
replacerItems = append(replacerItems, builder.String())
builder.Reset()
replacerItems = append(replacerItems, types.ToString(val))
builder.WriteString(marker.General)
builder.WriteString(key)
builder.WriteString(marker.General)
replacerItems = append(replacerItems, builder.String())
builder.Reset()
replacerItems = append(replacerItems, types.ToString(val))
}
replacer := strings.NewReplacer(replacerItems...)
final := replacer.Replace(template)
return final
}
// Replace replaces one placeholder in template with one value on the fly.
func ReplaceOne(template string, key string, value interface{}) string {
data := replaceOneWithMarkers(template, key, value, marker.ParenthesisOpen, marker.ParenthesisClose)
return replaceOneWithMarkers(data, key, value, marker.General, marker.General)
}
// replaceOneWithMarkers is a helper function that perform one time replacement
func replaceOneWithMarkers(template, key string, value interface{}, openMarker, closeMarker string) string {
return strings.Replace(template, openMarker+key+closeMarker, types.ToString(value), 1)
}