47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package shared
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var templateVarRe = regexp.MustCompile(`\{\{(\w+)\}\}`)
|
|
|
|
// BuiltinVars returns the built-in template variable values for the given time.
|
|
func BuiltinVars(now time.Time) map[string]string {
|
|
return map[string]string{
|
|
"date": now.Format("2006-01-02"),
|
|
"datetime": now.Format(time.RFC3339),
|
|
}
|
|
}
|
|
|
|
// ResolveVariables merges builtins, declared defaults, and provided values.
|
|
// Later sources override earlier ones: builtins < defaults < provided.
|
|
func ResolveVariables(
|
|
now time.Time,
|
|
declaredDefaults map[string]string,
|
|
provided map[string]string,
|
|
) map[string]string {
|
|
merged := BuiltinVars(now)
|
|
for k, v := range declaredDefaults {
|
|
merged[k] = v
|
|
}
|
|
for k, v := range provided {
|
|
merged[k] = v
|
|
}
|
|
return merged
|
|
}
|
|
|
|
// InterpolateTemplate replaces {{name}} placeholders with resolved values.
|
|
// Unknown variables are left as-is.
|
|
func InterpolateTemplate(tmpl string, vars map[string]string) string {
|
|
return templateVarRe.ReplaceAllStringFunc(tmpl, func(match string) string {
|
|
name := strings.TrimPrefix(strings.TrimSuffix(match, "}}"), "{{")
|
|
if val, ok := vars[name]; ok {
|
|
return val
|
|
}
|
|
return match
|
|
})
|
|
}
|