github.com/ijc/docker-app@v0.6.1-0.20181012090447-c7ca8bc483fb/internal/renderer/renderer.go (about) 1 package renderer 2 3 import ( 4 "sort" 5 "sync" 6 7 "github.com/docker/app/internal/renderer/driver" 8 "github.com/pkg/errors" 9 ) 10 11 var ( 12 driversMu sync.RWMutex 13 drivers = map[string]driver.Driver{} 14 ) 15 16 // Register makes a renderer available by the provided name. 17 // If Register is called twice with the same name or if driver is nil, 18 // it panics. 19 func Register(name string, driver driver.Driver) { 20 driversMu.Lock() 21 defer driversMu.Unlock() 22 if driver == nil { 23 panic("renderer: Register driver is nil") 24 } 25 if _, dup := drivers[name]; dup { 26 panic("renderer: Register called twice for driver " + name) 27 } 28 drivers[name] = driver 29 } 30 31 // Apply applies the specified render to the specified string with the specified settings. 32 // If the render is not present is the registered ones, it errors out. 33 func Apply(s string, settings map[string]interface{}, renderers ...string) (string, error) { 34 var err error 35 for _, r := range renderers { 36 if r == "none" { 37 continue 38 } 39 driversMu.RLock() 40 d, present := drivers[r] 41 driversMu.RUnlock() 42 if !present { 43 return "", errors.Errorf("unknown renderer %s", r) 44 } 45 s, err = d.Apply(s, settings) 46 if err != nil { 47 return "", err 48 } 49 } 50 return s, nil 51 } 52 53 // Drivers returns a sorted list of the names of the registered drivers. 54 func Drivers() []string { 55 list := []string{"none"} 56 driversMu.RLock() 57 for name := range drivers { 58 list = append(list, name) 59 } 60 driversMu.RUnlock() 61 sort.Strings(list) 62 return list 63 }