github.com/sylr/terraform@v0.11.12-beta1/helper/customdiff/compose.go (about)

     1  package customdiff
     2  
     3  import (
     4  	"github.com/hashicorp/go-multierror"
     5  	"github.com/hashicorp/terraform/helper/schema"
     6  )
     7  
     8  // All returns a CustomizeDiffFunc that runs all of the given
     9  // CustomizeDiffFuncs and returns all of the errors produced.
    10  //
    11  // If one function produces an error, functions after it are still run.
    12  // If this is not desirable, use function Sequence instead.
    13  //
    14  // If multiple functions returns errors, the result is a multierror.
    15  //
    16  // For example:
    17  //
    18  //     &schema.Resource{
    19  //         // ...
    20  //         CustomizeDiff: customdiff.All(
    21  //             customdiff.ValidateChange("size", func (old, new, meta interface{}) error {
    22  //                 // If we are increasing "size" then the new value must be
    23  //                 // a multiple of the old value.
    24  //                 if new.(int) <= old.(int) {
    25  //                     return nil
    26  //                 }
    27  //                 if (new.(int) % old.(int)) != 0 {
    28  //                     return fmt.Errorf("new size value must be an integer multiple of old value %d", old.(int))
    29  //                 }
    30  //                 return nil
    31  //             }),
    32  //             customdiff.ForceNewIfChange("size", func (old, new, meta interface{}) bool {
    33  //                 // "size" can only increase in-place, so we must create a new resource
    34  //                 // if it is decreased.
    35  //                 return new.(int) < old.(int)
    36  //             }),
    37  //             customdiff.ComputedIf("version_id", func (d *schema.ResourceDiff, meta interface{}) bool {
    38  //                 // Any change to "content" causes a new "version_id" to be allocated.
    39  //                 return d.HasChange("content")
    40  //             }),
    41  //         ),
    42  //     }
    43  //
    44  func All(funcs ...schema.CustomizeDiffFunc) schema.CustomizeDiffFunc {
    45  	return func(d *schema.ResourceDiff, meta interface{}) error {
    46  		var err error
    47  		for _, f := range funcs {
    48  			thisErr := f(d, meta)
    49  			if thisErr != nil {
    50  				err = multierror.Append(err, thisErr)
    51  			}
    52  		}
    53  		return err
    54  	}
    55  }
    56  
    57  // Sequence returns a CustomizeDiffFunc that runs all of the given
    58  // CustomizeDiffFuncs in sequence, stopping at the first one that returns
    59  // an error and returning that error.
    60  //
    61  // If all functions succeed, the combined function also succeeds.
    62  func Sequence(funcs ...schema.CustomizeDiffFunc) schema.CustomizeDiffFunc {
    63  	return func(d *schema.ResourceDiff, meta interface{}) error {
    64  		for _, f := range funcs {
    65  			err := f(d, meta)
    66  			if err != nil {
    67  				return err
    68  			}
    69  		}
    70  		return nil
    71  	}
    72  }