11package  v1beta1
22
3+ import  (
4+ 	"fmt" 
5+ 	"reflect" 
6+ 	"strconv" 
7+ 
8+ 	"sigs.k8s.io/yaml" 
9+ )
10+ 
311func  (p  * Parameter ) IsImmutable () bool  {
412	return  p .Immutable  !=  nil  &&  * p .Immutable 
513}
@@ -8,10 +16,173 @@ func (p *Parameter) IsRequired() bool {
816	return  p .Required  !=  nil  &&  * p .Required 
917}
1018
19+ func  (p  * Parameter ) IsEnum () bool  {
20+ 	return  p .Enum  !=  nil 
21+ }
22+ 
1123func  (p  * Parameter ) HasDefault () bool  {
1224	return  p .Default  !=  nil 
1325}
1426
27+ func  (p  * Parameter ) EnumValues () []string  {
28+ 	if  p .IsEnum () {
29+ 		return  * p .Enum 
30+ 	}
31+ 	return  []string {}
32+ }
33+ 
34+ func  (p  * Parameter ) ValidateDefault () error  {
35+ 	if  err  :=  ValidateParameterValueForType (p .Type , p .Default ); err  !=  nil  {
36+ 		return  fmt .Errorf ("parameter %q has an invalid default value: %v" , p .Name , err )
37+ 	}
38+ 	if  p .IsEnum () {
39+ 		if  err  :=  ValidateParameterValueForEnum (p .EnumValues (), p .Default ); err  !=  nil  {
40+ 			return  fmt .Errorf ("parameter %q has an invalid default value: %v" , p .Name , err )
41+ 		}
42+ 	}
43+ 	return  nil 
44+ }
45+ 
46+ // ValidateValue ensures that a the given value is valid for this parameter 
47+ func  (p  * Parameter ) ValidateValue (pValue  string ) error  {
48+ 	if  p .IsRequired () &&  ! p .HasDefault () &&  pValue  ==  ""  {
49+ 		return  fmt .Errorf ("parameter %q is required but has no value set" , p .Name )
50+ 	}
51+ 
52+ 	if  pValue  ==  ""  {
53+ 		return  nil 
54+ 	}
55+ 
56+ 	if  err  :=  ValidateParameterValueForType (p .Type , pValue ); err  !=  nil  {
57+ 		return  fmt .Errorf ("parameter %q has an invalid value %q: %v" , p .Name , pValue , err )
58+ 	}
59+ 	if  p .IsEnum () {
60+ 		if  err  :=  ValidateParameterValueForEnum (p .EnumValues (), pValue ); err  !=  nil  {
61+ 			return  fmt .Errorf ("parameter %q has an invalid value %q: %v" , p .Name , pValue , err )
62+ 		}
63+ 	}
64+ 	return  nil 
65+ }
66+ 
67+ func  ValidateParameterValueForType (pType  ParameterType , pValue  interface {}) error  {
68+ 	switch  pType  {
69+ 	case  StringValueType :
70+ 		_ , ok  :=  pValue .(string )
71+ 		if  ! ok  {
72+ 			return  fmt .Errorf ("type is %q but format is invalid: %s" , pType , pValue )
73+ 		}
74+ 	case  IntegerValueType :
75+ 		return  validateIntegerType (pValue )
76+ 	case  NumberValueType :
77+ 		return  validateNumberType (pValue )
78+ 	case  BooleanValueType :
79+ 		return  validateBooleanType (pValue )
80+ 	case  ArrayValueType :
81+ 		return  validateArrayType (pValue )
82+ 	case  MapValueType :
83+ 		return  validateMapType (pValue )
84+ 	}
85+ 	return  nil 
86+ }
87+ 
88+ func  validateIntegerType (pValue  interface {}) error  {
89+ 	switch  v  :=  pValue .(type ) {
90+ 	case  int , int8 , int16 , int32 , int64 :
91+ 		return  nil 
92+ 	case  uint , uint8 , uint16 , uint32 , uint64 :
93+ 		return  nil 
94+ 	case  string :
95+ 		_ , err  :=  strconv .ParseInt (v , 10 , 64 )
96+ 		if  err  !=  nil  {
97+ 			return  fmt .Errorf ("type is %q but format of %q is invalid: %v" , IntegerValueType , pValue , err )
98+ 		}
99+ 	default :
100+ 		return  fmt .Errorf ("type is %q but format of %s is invalid" , IntegerValueType , pValue )
101+ 	}
102+ 	return  nil 
103+ }
104+ 
105+ func  validateNumberType (pValue  interface {}) error  {
106+ 	switch  v  :=  pValue .(type ) {
107+ 	case  int , int8 , int16 , int32 , int64 :
108+ 		return  nil 
109+ 	case  uint , uint8 , uint16 , uint32 , uint64 :
110+ 		return  nil 
111+ 	case  float32 , float64 :
112+ 		return  nil 
113+ 	case  string :
114+ 		_ , err  :=  strconv .ParseFloat (v , 64 )
115+ 		if  err  !=  nil  {
116+ 			return  fmt .Errorf ("type is %q but format of %q is invalid: %v" , NumberValueType , pValue , err )
117+ 		}
118+ 	default :
119+ 		return  fmt .Errorf ("type is %q but format of %s is invalid" , NumberValueType , v )
120+ 	}
121+ 	return  nil 
122+ }
123+ 
124+ func  validateBooleanType (pValue  interface {}) error  {
125+ 	switch  v  :=  pValue .(type ) {
126+ 	case  bool :
127+ 		return  nil 
128+ 	case  string :
129+ 		_ , err  :=  strconv .ParseBool (v )
130+ 		if  err  !=  nil  {
131+ 			return  fmt .Errorf ("type is %q but format of %q is invalid: %v" , BooleanValueType , pValue , err )
132+ 		}
133+ 	default :
134+ 		return  fmt .Errorf ("type is %q but format of %s is invalid" , BooleanValueType , pValue )
135+ 	}
136+ 	return  nil 
137+ }
138+ 
139+ func  validateArrayType (pValue  interface {}) error  {
140+ 	t  :=  reflect .TypeOf (pValue )
141+ 	switch  t .Kind () {
142+ 	case  reflect .Slice , reflect .Array :
143+ 		return  nil 
144+ 	case  reflect .String :
145+ 		str , _  :=  pValue .(string ) // We know here this is a string 
146+ 
147+ 		var  result  []interface {}
148+ 		if  err  :=  yaml .Unmarshal ([]byte (str ), & result ); err  !=  nil  {
149+ 			return  fmt .Errorf ("type is %q, but format of %s is invalid" , ArrayValueType , pValue )
150+ 		}
151+ 
152+ 		return  nil 
153+ 	default :
154+ 		return  fmt .Errorf ("type is %q but value %s is not an array" , ArrayValueType , pValue )
155+ 	}
156+ }
157+ 
158+ func  validateMapType (pValue  interface {}) error  {
159+ 	t  :=  reflect .TypeOf (pValue )
160+ 	switch  t .Kind () {
161+ 	case  reflect .Map , reflect .Struct :
162+ 		return  nil 
163+ 	case  reflect .String :
164+ 		str , _  :=  pValue .(string ) // We know here this is a string 
165+ 
166+ 		var  result  map [string ]interface {}
167+ 		if  err  :=  yaml .Unmarshal ([]byte (str ), & result ); err  !=  nil  {
168+ 			return  fmt .Errorf ("type is %q, but format of %s is invalid" , MapValueType , pValue )
169+ 		}
170+ 
171+ 		return  nil 
172+ 	default :
173+ 		return  fmt .Errorf ("type is %q but value %s is not a map" , MapValueType , pValue )
174+ 	}
175+ }
176+ 
177+ func  ValidateParameterValueForEnum (enumValues  []string , pValue  interface {}) error  {
178+ 	for  _ , eValue  :=  range  enumValues  {
179+ 		if  pValue  ==  eValue  {
180+ 			return  nil 
181+ 		}
182+ 	}
183+ 	return  fmt .Errorf ("value is %q, but only allowed values are %v" , pValue , enumValues )
184+ }
185+ 
15186// GetChangedParamDefs returns a list of parameters from ov2 that changed based on the given compare function between ov1 and ov2 
16187func  GetChangedParamDefs (p1 , p2  []Parameter , isEqual  func (p1 , p2  Parameter ) bool ) []Parameter  {
17188	changedParams  :=  []Parameter {}
0 commit comments