mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-03 20:40:25 +08:00
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package configutils
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// 变量信息存储类型
|
|
type VariableHolder string
|
|
|
|
var variableMapping = map[string][]interface{}{}
|
|
var variableLocker = sync.RWMutex{}
|
|
var regexpNamedVariable = regexp.MustCompile("\\${[\\w.-]+}")
|
|
|
|
// 分析变量
|
|
func ParseVariables(source string, replacer func(varName string) (value string)) string {
|
|
variableLocker.RLock()
|
|
holders, found := variableMapping[source]
|
|
variableLocker.RUnlock()
|
|
if !found {
|
|
indexes := regexpNamedVariable.FindAllStringIndex(source, -1)
|
|
before := 0
|
|
for _, loc := range indexes {
|
|
holders = append(holders, []byte(source[before:loc[0]]))
|
|
holder := source[loc[0]+2 : loc[1]-1]
|
|
holders = append(holders, VariableHolder(holder))
|
|
before = loc[1]
|
|
}
|
|
if before < len(source) {
|
|
holders = append(holders, []byte(source[before:]))
|
|
}
|
|
variableLocker.Lock()
|
|
variableMapping[source] = holders
|
|
variableLocker.Unlock()
|
|
}
|
|
|
|
// no variables
|
|
if len(holders) == 0 {
|
|
return source
|
|
}
|
|
|
|
// replace
|
|
result := strings.Builder{}
|
|
for _, h := range holders {
|
|
holder, ok := h.(VariableHolder)
|
|
if ok {
|
|
result.WriteString(replacer(string(holder)))
|
|
} else {
|
|
result.Write(h.([]byte))
|
|
}
|
|
}
|
|
return result.String()
|
|
}
|