mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2026-02-14 11:15:38 +08:00
阶段性提交
This commit is contained in:
@@ -6,30 +6,21 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// 变量信息存储类型
|
||||
// VariableHolder 变量信息存储类型
|
||||
type VariableHolder string
|
||||
type VariableHolders = []interface{}
|
||||
|
||||
var variableMapping = map[string][]interface{}{}
|
||||
var variableMapping = map[string][]interface{}{} // source => [holder1, ...]
|
||||
var variableLocker = sync.RWMutex{}
|
||||
var regexpNamedVariable = regexp.MustCompile("\\${[\\w.-]+}")
|
||||
|
||||
// 分析变量
|
||||
// ParseVariables 分析变量
|
||||
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:]))
|
||||
}
|
||||
holders = ParseHolders(source)
|
||||
variableLocker.Lock()
|
||||
variableMapping[source] = holders
|
||||
variableLocker.Unlock()
|
||||
@@ -53,7 +44,43 @@ func ParseVariables(source string, replacer func(varName string) (value string))
|
||||
return result.String()
|
||||
}
|
||||
|
||||
// 判断是否有变量
|
||||
// ParseVariablesFromHolders 从占位中分析变量
|
||||
func ParseVariablesFromHolders(holders VariableHolders, replacer func(varName string) (value string)) string {
|
||||
// no variables
|
||||
if len(holders) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
// 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()
|
||||
}
|
||||
|
||||
// ParseHolders 分析占位
|
||||
func ParseHolders(source string) (holders VariableHolders) {
|
||||
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:]))
|
||||
}
|
||||
return holders
|
||||
}
|
||||
|
||||
// HasVariables 判断是否有变量
|
||||
func HasVariables(source string) bool {
|
||||
return regexpNamedVariable.MatchString(source)
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package configutils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"strconv"
|
||||
"testing"
|
||||
)
|
||||
@@ -22,6 +23,17 @@ func TestParseNoVariables(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseHolders(t *testing.T) {
|
||||
var holders = ParseHolders("hello, ${name}, world")
|
||||
for _, h := range holders {
|
||||
t.Log(types.String(h))
|
||||
}
|
||||
|
||||
t.Log("parse result:", ParseVariablesFromHolders(holders, func(s string) string {
|
||||
return "[" + s + "]"
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkParseVariables(b *testing.B) {
|
||||
_ = ParseVariables("hello, ${name}, ${age}, ${gender}, ${home}, world", func(s string) string {
|
||||
return "Lu"
|
||||
@@ -34,6 +46,16 @@ func BenchmarkParseVariables(b *testing.B) {
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkParseVariablesFromHolders(b *testing.B) {
|
||||
var holders = ParseHolders("hello, ${name}, ${age}, ${gender}, ${home}, world")
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = ParseVariablesFromHolders(holders, func(s string) string {
|
||||
return "Lu"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkParseVariablesUnique(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = ParseVariables("hello, ${name} "+strconv.Itoa(i%1000), func(s string) string {
|
||||
|
||||
Reference in New Issue
Block a user