| 297 | } |
| 298 | |
| 299 | func byMinMax(a *AttributeExpr, r *ExampleGenerator) any { |
| 300 | if !hasMinMaxValidation(a) { |
| 301 | return nil |
| 302 | } |
| 303 | var ( |
| 304 | minimum float64 |
| 305 | maximum = math.Inf(1) |
| 306 | sign = 1 |
| 307 | ) |
| 308 | if a.Validation.ExclusiveMaximum != nil { |
| 309 | maximum = *a.Validation.ExclusiveMaximum |
| 310 | } else if a.Validation.Maximum != nil { |
| 311 | maximum = *a.Validation.Maximum |
| 312 | } |
| 313 | switch { |
| 314 | case a.Validation.ExclusiveMinimum != nil: |
| 315 | minimum = *a.Validation.ExclusiveMinimum |
| 316 | case a.Validation.Minimum != nil: |
| 317 | minimum = *a.Validation.Minimum |
| 318 | default: |
| 319 | sign = -1 |
| 320 | minimum = maximum |
| 321 | maximum = math.Inf(1) |
| 322 | } |
| 323 | |
| 324 | if math.IsInf(maximum, 1) { |
| 325 | switch a.Type.Kind() { |
| 326 | case IntKind: |
| 327 | return sign * (r.Int() + int(minimum)) |
| 328 | case Int32Kind: |
| 329 | return int32(sign) * (r.Int32() + int32(minimum)) |
| 330 | case Int64Kind: |
| 331 | return int64(sign) * (r.Int64() + int64(minimum)) |
| 332 | case UIntKind: |
| 333 | return r.UInt() + uint(minimum) |
| 334 | case UInt32Kind: |
| 335 | return r.UInt32() + uint32(minimum) |
| 336 | case UInt64Kind: |
| 337 | return r.UInt64() + uint64(minimum) |
| 338 | case Float32Kind: |
| 339 | return float32(sign) * (r.Float32() + float32(minimum)) |
| 340 | default: |
| 341 | return float64(sign) * (r.Float64() + minimum) |
| 342 | } |
| 343 | } |
| 344 | if minimum < maximum { |
| 345 | delta := maximum - minimum |
| 346 | switch a.Type.Kind() { |
| 347 | case IntKind: |
| 348 | return r.Int()%int(delta) + int(minimum) |
| 349 | case Int32Kind: |
| 350 | return r.Int32()%int32(delta) + int32(minimum) |
| 351 | case Int64Kind: |
| 352 | return r.Int64()%int64(delta) + int64(minimum) |
| 353 | case UIntKind: |
| 354 | return r.UInt()%uint(delta) + uint(minimum) |
| 355 | case UInt32Kind: |
| 356 | return r.UInt32()%uint32(delta) + uint32(minimum) |