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  }