github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/helper/validation/validation.go (about) 1 package validation 2 3 import ( 4 "fmt" 5 "net" 6 "strings" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 "github.com/hashicorp/terraform/helper/structure" 10 ) 11 12 // IntBetween returns a SchemaValidateFunc which tests if the provided value 13 // is of type int and is between min and max (inclusive) 14 func IntBetween(min, max int) schema.SchemaValidateFunc { 15 return func(i interface{}, k string) (s []string, es []error) { 16 v, ok := i.(int) 17 if !ok { 18 es = append(es, fmt.Errorf("expected type of %s to be int", k)) 19 return 20 } 21 22 if v < min || v > max { 23 es = append(es, fmt.Errorf("expected %s to be in the range (%d - %d), got %d", k, min, max, v)) 24 return 25 } 26 27 return 28 } 29 } 30 31 // StringInSlice returns a SchemaValidateFunc which tests if the provided value 32 // is of type string and matches the value of an element in the valid slice 33 // will test with in lower case if ignoreCase is true 34 func StringInSlice(valid []string, ignoreCase bool) schema.SchemaValidateFunc { 35 return func(i interface{}, k string) (s []string, es []error) { 36 v, ok := i.(string) 37 if !ok { 38 es = append(es, fmt.Errorf("expected type of %s to be string", k)) 39 return 40 } 41 42 for _, str := range valid { 43 if v == str || (ignoreCase && strings.ToLower(v) == strings.ToLower(str)) { 44 return 45 } 46 } 47 48 es = append(es, fmt.Errorf("expected %s to be one of %v, got %s", k, valid, v)) 49 return 50 } 51 } 52 53 // StringLenBetween returns a SchemaValidateFunc which tests if the provided value 54 // is of type string and has length between min and max (inclusive) 55 func StringLenBetween(min, max int) schema.SchemaValidateFunc { 56 return func(i interface{}, k string) (s []string, es []error) { 57 v, ok := i.(string) 58 if !ok { 59 es = append(es, fmt.Errorf("expected type of %s to be string", k)) 60 return 61 } 62 if len(v) < min || len(v) > max { 63 es = append(es, fmt.Errorf("expected length of %s to be in the range (%d - %d), got %s", k, min, max, v)) 64 } 65 return 66 } 67 } 68 69 // CIDRNetwork returns a SchemaValidateFunc which tests if the provided value 70 // is of type string, is in valid CIDR network notation, and has significant bits between min and max (inclusive) 71 func CIDRNetwork(min, max int) schema.SchemaValidateFunc { 72 return func(i interface{}, k string) (s []string, es []error) { 73 v, ok := i.(string) 74 if !ok { 75 es = append(es, fmt.Errorf("expected type of %s to be string", k)) 76 return 77 } 78 79 _, ipnet, err := net.ParseCIDR(v) 80 if err != nil { 81 es = append(es, fmt.Errorf( 82 "expected %s to contain a valid CIDR, got: %s with err: %s", k, v, err)) 83 return 84 } 85 86 if ipnet == nil || v != ipnet.String() { 87 es = append(es, fmt.Errorf( 88 "expected %s to contain a valid network CIDR, expected %s, got %s", 89 k, ipnet, v)) 90 } 91 92 sigbits, _ := ipnet.Mask.Size() 93 if sigbits < min || sigbits > max { 94 es = append(es, fmt.Errorf( 95 "expected %q to contain a network CIDR with between %d and %d significant bits, got: %d", 96 k, min, max, sigbits)) 97 } 98 99 return 100 } 101 } 102 103 func ValidateJsonString(v interface{}, k string) (ws []string, errors []error) { 104 if _, err := structure.NormalizeJsonString(v); err != nil { 105 errors = append(errors, fmt.Errorf("%q contains an invalid JSON: %s", k, err)) 106 } 107 return 108 }