mirror of
https://github.com/go-task/task.git
synced 2024-12-16 10:59:23 +02:00
79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package templater
|
|
|
|
import (
|
|
"bytes"
|
|
"text/template"
|
|
|
|
"github.com/go-task/task/v2/internal/taskfile"
|
|
)
|
|
|
|
// Templater is a help struct that allow us to call "replaceX" funcs multiple
|
|
// times, without having to check for error each time. The first error that
|
|
// happen will be assigned to r.err, and consecutive calls to funcs will just
|
|
// return the zero value.
|
|
type Templater struct {
|
|
Vars taskfile.Vars
|
|
|
|
cacheMap map[string](interface{})
|
|
err error
|
|
}
|
|
|
|
func (r *Templater) RefreshCacheMap() {
|
|
r.cacheMap = r.Vars.ToCacheMap()
|
|
}
|
|
|
|
func (r *Templater) Replace(str string) string {
|
|
if r.err != nil || str == "" {
|
|
return ""
|
|
}
|
|
|
|
templ, err := template.New("").Funcs(templateFuncs).Parse(str)
|
|
if err != nil {
|
|
r.err = err
|
|
return ""
|
|
}
|
|
|
|
if r.cacheMap == nil {
|
|
r.cacheMap = r.Vars.ToCacheMap()
|
|
}
|
|
|
|
var b bytes.Buffer
|
|
if err = templ.Execute(&b, r.cacheMap); err != nil {
|
|
r.err = err
|
|
return ""
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
func (r *Templater) ReplaceSlice(strs []string) []string {
|
|
if r.err != nil || len(strs) == 0 {
|
|
return nil
|
|
}
|
|
|
|
new := make([]string, len(strs))
|
|
for i, str := range strs {
|
|
new[i] = r.Replace(str)
|
|
}
|
|
return new
|
|
}
|
|
|
|
func (r *Templater) ReplaceVars(vars taskfile.Vars) taskfile.Vars {
|
|
if r.err != nil || len(vars) == 0 {
|
|
return nil
|
|
}
|
|
|
|
new := make(taskfile.Vars, len(vars))
|
|
for k, v := range vars {
|
|
new[k] = taskfile.Var{
|
|
Static: r.Replace(v.Static),
|
|
Live: v.Live,
|
|
Sh: r.Replace(v.Sh),
|
|
}
|
|
}
|
|
return new
|
|
}
|
|
|
|
func (r *Templater) Err() error {
|
|
return r.err
|
|
}
|