github.com/aavshr/aws-sdk-go@v1.41.3/aws/request/validation.go (about) 1 package request 2 3 import ( 4 "bytes" 5 "fmt" 6 7 "github.com/aavshr/aws-sdk-go/aws/awserr" 8 ) 9 10 const ( 11 // InvalidParameterErrCode is the error code for invalid parameters errors 12 InvalidParameterErrCode = "InvalidParameter" 13 // ParamRequiredErrCode is the error code for required parameter errors 14 ParamRequiredErrCode = "ParamRequiredError" 15 // ParamMinValueErrCode is the error code for fields with too low of a 16 // number value. 17 ParamMinValueErrCode = "ParamMinValueError" 18 // ParamMinLenErrCode is the error code for fields without enough elements. 19 ParamMinLenErrCode = "ParamMinLenError" 20 // ParamMaxLenErrCode is the error code for value being too long. 21 ParamMaxLenErrCode = "ParamMaxLenError" 22 23 // ParamFormatErrCode is the error code for a field with invalid 24 // format or characters. 25 ParamFormatErrCode = "ParamFormatInvalidError" 26 ) 27 28 // Validator provides a way for types to perform validation logic on their 29 // input values that external code can use to determine if a type's values 30 // are valid. 31 type Validator interface { 32 Validate() error 33 } 34 35 // An ErrInvalidParams provides wrapping of invalid parameter errors found when 36 // validating API operation input parameters. 37 type ErrInvalidParams struct { 38 // Context is the base context of the invalid parameter group. 39 Context string 40 errs []ErrInvalidParam 41 } 42 43 // Add adds a new invalid parameter error to the collection of invalid 44 // parameters. The context of the invalid parameter will be updated to reflect 45 // this collection. 46 func (e *ErrInvalidParams) Add(err ErrInvalidParam) { 47 err.SetContext(e.Context) 48 e.errs = append(e.errs, err) 49 } 50 51 // AddNested adds the invalid parameter errors from another ErrInvalidParams 52 // value into this collection. The nested errors will have their nested context 53 // updated and base context to reflect the merging. 54 // 55 // Use for nested validations errors. 56 func (e *ErrInvalidParams) AddNested(nestedCtx string, nested ErrInvalidParams) { 57 for _, err := range nested.errs { 58 err.SetContext(e.Context) 59 err.AddNestedContext(nestedCtx) 60 e.errs = append(e.errs, err) 61 } 62 } 63 64 // Len returns the number of invalid parameter errors 65 func (e ErrInvalidParams) Len() int { 66 return len(e.errs) 67 } 68 69 // Code returns the code of the error 70 func (e ErrInvalidParams) Code() string { 71 return InvalidParameterErrCode 72 } 73 74 // Message returns the message of the error 75 func (e ErrInvalidParams) Message() string { 76 return fmt.Sprintf("%d validation error(s) found.", len(e.errs)) 77 } 78 79 // Error returns the string formatted form of the invalid parameters. 80 func (e ErrInvalidParams) Error() string { 81 w := &bytes.Buffer{} 82 fmt.Fprintf(w, "%s: %s\n", e.Code(), e.Message()) 83 84 for _, err := range e.errs { 85 fmt.Fprintf(w, "- %s\n", err.Message()) 86 } 87 88 return w.String() 89 } 90 91 // OrigErr returns the invalid parameters as a awserr.BatchedErrors value 92 func (e ErrInvalidParams) OrigErr() error { 93 return awserr.NewBatchError( 94 InvalidParameterErrCode, e.Message(), e.OrigErrs()) 95 } 96 97 // OrigErrs returns a slice of the invalid parameters 98 func (e ErrInvalidParams) OrigErrs() []error { 99 errs := make([]error, len(e.errs)) 100 for i := 0; i < len(errs); i++ { 101 errs[i] = e.errs[i] 102 } 103 104 return errs 105 } 106 107 // An ErrInvalidParam represents an invalid parameter error type. 108 type ErrInvalidParam interface { 109 awserr.Error 110 111 // Field name the error occurred on. 112 Field() string 113 114 // SetContext updates the context of the error. 115 SetContext(string) 116 117 // AddNestedContext updates the error's context to include a nested level. 118 AddNestedContext(string) 119 } 120 121 type errInvalidParam struct { 122 context string 123 nestedContext string 124 field string 125 code string 126 msg string 127 } 128 129 // Code returns the error code for the type of invalid parameter. 130 func (e *errInvalidParam) Code() string { 131 return e.code 132 } 133 134 // Message returns the reason the parameter was invalid, and its context. 135 func (e *errInvalidParam) Message() string { 136 return fmt.Sprintf("%s, %s.", e.msg, e.Field()) 137 } 138 139 // Error returns the string version of the invalid parameter error. 140 func (e *errInvalidParam) Error() string { 141 return fmt.Sprintf("%s: %s", e.code, e.Message()) 142 } 143 144 // OrigErr returns nil, Implemented for awserr.Error interface. 145 func (e *errInvalidParam) OrigErr() error { 146 return nil 147 } 148 149 // Field Returns the field and context the error occurred. 150 func (e *errInvalidParam) Field() string { 151 field := e.context 152 if len(field) > 0 { 153 field += "." 154 } 155 if len(e.nestedContext) > 0 { 156 field += fmt.Sprintf("%s.", e.nestedContext) 157 } 158 field += e.field 159 160 return field 161 } 162 163 // SetContext updates the base context of the error. 164 func (e *errInvalidParam) SetContext(ctx string) { 165 e.context = ctx 166 } 167 168 // AddNestedContext prepends a context to the field's path. 169 func (e *errInvalidParam) AddNestedContext(ctx string) { 170 if len(e.nestedContext) == 0 { 171 e.nestedContext = ctx 172 } else { 173 e.nestedContext = fmt.Sprintf("%s.%s", ctx, e.nestedContext) 174 } 175 176 } 177 178 // An ErrParamRequired represents an required parameter error. 179 type ErrParamRequired struct { 180 errInvalidParam 181 } 182 183 // NewErrParamRequired creates a new required parameter error. 184 func NewErrParamRequired(field string) *ErrParamRequired { 185 return &ErrParamRequired{ 186 errInvalidParam{ 187 code: ParamRequiredErrCode, 188 field: field, 189 msg: fmt.Sprintf("missing required field"), 190 }, 191 } 192 } 193 194 // An ErrParamMinValue represents a minimum value parameter error. 195 type ErrParamMinValue struct { 196 errInvalidParam 197 min float64 198 } 199 200 // NewErrParamMinValue creates a new minimum value parameter error. 201 func NewErrParamMinValue(field string, min float64) *ErrParamMinValue { 202 return &ErrParamMinValue{ 203 errInvalidParam: errInvalidParam{ 204 code: ParamMinValueErrCode, 205 field: field, 206 msg: fmt.Sprintf("minimum field value of %v", min), 207 }, 208 min: min, 209 } 210 } 211 212 // MinValue returns the field's require minimum value. 213 // 214 // float64 is returned for both int and float min values. 215 func (e *ErrParamMinValue) MinValue() float64 { 216 return e.min 217 } 218 219 // An ErrParamMinLen represents a minimum length parameter error. 220 type ErrParamMinLen struct { 221 errInvalidParam 222 min int 223 } 224 225 // NewErrParamMinLen creates a new minimum length parameter error. 226 func NewErrParamMinLen(field string, min int) *ErrParamMinLen { 227 return &ErrParamMinLen{ 228 errInvalidParam: errInvalidParam{ 229 code: ParamMinLenErrCode, 230 field: field, 231 msg: fmt.Sprintf("minimum field size of %v", min), 232 }, 233 min: min, 234 } 235 } 236 237 // MinLen returns the field's required minimum length. 238 func (e *ErrParamMinLen) MinLen() int { 239 return e.min 240 } 241 242 // An ErrParamMaxLen represents a maximum length parameter error. 243 type ErrParamMaxLen struct { 244 errInvalidParam 245 max int 246 } 247 248 // NewErrParamMaxLen creates a new maximum length parameter error. 249 func NewErrParamMaxLen(field string, max int, value string) *ErrParamMaxLen { 250 return &ErrParamMaxLen{ 251 errInvalidParam: errInvalidParam{ 252 code: ParamMaxLenErrCode, 253 field: field, 254 msg: fmt.Sprintf("maximum size of %v, %v", max, value), 255 }, 256 max: max, 257 } 258 } 259 260 // MaxLen returns the field's required minimum length. 261 func (e *ErrParamMaxLen) MaxLen() int { 262 return e.max 263 } 264 265 // An ErrParamFormat represents a invalid format parameter error. 266 type ErrParamFormat struct { 267 errInvalidParam 268 format string 269 } 270 271 // NewErrParamFormat creates a new invalid format parameter error. 272 func NewErrParamFormat(field string, format, value string) *ErrParamFormat { 273 return &ErrParamFormat{ 274 errInvalidParam: errInvalidParam{ 275 code: ParamFormatErrCode, 276 field: field, 277 msg: fmt.Sprintf("format %v, %v", format, value), 278 }, 279 format: format, 280 } 281 } 282 283 // Format returns the field's required format. 284 func (e *ErrParamFormat) Format() string { 285 return e.format 286 }