| package pb |
| |
| import ( |
| "math/rand" |
| "sync" |
| "text/template" |
| |
| "github.com/fatih/color" |
| ) |
| |
| // ProgressBarTemplate that template string |
| type ProgressBarTemplate string |
| |
| // New creates new bar from template |
| func (pbt ProgressBarTemplate) New(total int) *ProgressBar { |
| return New(total).SetTemplate(pbt) |
| } |
| |
| // Start64 create and start new bar with given int64 total value |
| func (pbt ProgressBarTemplate) Start64(total int64) *ProgressBar { |
| return New64(total).SetTemplate(pbt).Start() |
| } |
| |
| // Start create and start new bar with given int total value |
| func (pbt ProgressBarTemplate) Start(total int) *ProgressBar { |
| return pbt.Start64(int64(total)) |
| } |
| |
| var templateCacheMu sync.Mutex |
| var templateCache = make(map[string]*template.Template) |
| |
| var defaultTemplateFuncs = template.FuncMap{ |
| // colors |
| "black": color.New(color.FgBlack).SprintFunc(), |
| "red": color.New(color.FgRed).SprintFunc(), |
| "green": color.New(color.FgGreen).SprintFunc(), |
| "yellow": color.New(color.FgYellow).SprintFunc(), |
| "blue": color.New(color.FgBlue).SprintFunc(), |
| "magenta": color.New(color.FgMagenta).SprintFunc(), |
| "cyan": color.New(color.FgCyan).SprintFunc(), |
| "white": color.New(color.FgWhite).SprintFunc(), |
| "resetcolor": color.New(color.Reset).SprintFunc(), |
| "rndcolor": rndcolor, |
| "rnd": rnd, |
| } |
| |
| func getTemplate(tmpl string) (t *template.Template, err error) { |
| templateCacheMu.Lock() |
| defer templateCacheMu.Unlock() |
| t = templateCache[tmpl] |
| if t != nil { |
| // found in cache |
| return |
| } |
| t = template.New("") |
| fillTemplateFuncs(t) |
| _, err = t.Parse(tmpl) |
| if err != nil { |
| t = nil |
| return |
| } |
| templateCache[tmpl] = t |
| return |
| } |
| |
| func fillTemplateFuncs(t *template.Template) { |
| t.Funcs(defaultTemplateFuncs) |
| emf := make(template.FuncMap) |
| elementsM.Lock() |
| for k, v := range elements { |
| element := v |
| emf[k] = func(state *State, args ...string) string { return element.ProgressElement(state, args...) } |
| } |
| elementsM.Unlock() |
| t.Funcs(emf) |
| return |
| } |
| |
| func rndcolor(s string) string { |
| c := rand.Intn(int(color.FgWhite-color.FgBlack)) + int(color.FgBlack) |
| return color.New(color.Attribute(c)).Sprint(s) |
| } |
| |
| func rnd(args ...string) string { |
| if len(args) == 0 { |
| return "" |
| } |
| return args[rand.Intn(len(args))] |
| } |