| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 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))]
- }
|