github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/terraform/util.go (about)

     1  package terraform
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  // Semaphore is a wrapper around a channel to provide
     8  // utility methods to clarify that we are treating the
     9  // channel as a semaphore
    10  type Semaphore chan struct{}
    11  
    12  // NewSemaphore creates a semaphore that allows up
    13  // to a given limit of simultaneous acquisitions
    14  func NewSemaphore(n int) Semaphore {
    15  	if n == 0 {
    16  		panic("semaphore with limit 0")
    17  	}
    18  	ch := make(chan struct{}, n)
    19  	return Semaphore(ch)
    20  }
    21  
    22  // Acquire is used to acquire an available slot.
    23  // Blocks until available.
    24  func (s Semaphore) Acquire() {
    25  	s <- struct{}{}
    26  }
    27  
    28  // TryAcquire is used to do a non-blocking acquire.
    29  // Returns a bool indicating success
    30  func (s Semaphore) TryAcquire() bool {
    31  	select {
    32  	case s <- struct{}{}:
    33  		return true
    34  	default:
    35  		return false
    36  	}
    37  }
    38  
    39  // Release is used to return a slot. Acquire must
    40  // be called as a pre-condition.
    41  func (s Semaphore) Release() {
    42  	select {
    43  	case <-s:
    44  	default:
    45  		panic("release without an acquire")
    46  	}
    47  }
    48  
    49  // resourceProvider returns the provider name for the given type.
    50  func resourceProvider(t, alias string) string {
    51  	if alias != "" {
    52  		return alias
    53  	}
    54  
    55  	idx := strings.IndexRune(t, '_')
    56  	if idx == -1 {
    57  		// If no underscores, the resource name is assumed to be
    58  		// also the provider name, e.g. if the provider exposes
    59  		// only a single resource of each type.
    60  		return t
    61  	}
    62  
    63  	return t[:idx]
    64  }
    65  
    66  // strSliceContains checks if a given string is contained in a slice
    67  // When anybody asks why Go needs generics, here you go.
    68  func strSliceContains(haystack []string, needle string) bool {
    69  	for _, s := range haystack {
    70  		if s == needle {
    71  			return true
    72  		}
    73  	}
    74  	return false
    75  }