unit.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package unit
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type Unit string
  7. const (
  8. // Durations of time
  9. Millisecond Unit = "ms"
  10. Second Unit = "s"
  11. Minute Unit = "min"
  12. Hour Unit = "hr"
  13. // Data storage and transfer
  14. Byte Unit = "B"
  15. KiB Unit = "KiB"
  16. MiB Unit = "MiB"
  17. GiB Unit = "GiB"
  18. // Compute resources
  19. MCPU Unit = "mCPU"
  20. VCPU Unit = "vCPU"
  21. GPU Unit = "GPU"
  22. // Compute resources cumulative over time
  23. GiBHour Unit = "GiB-hr"
  24. GPUHour Unit = "GPU-hr"
  25. VCPUHour Unit = "vCPU-hr"
  26. )
  27. // validUnits is a map of all valid unit strings for quick lookup
  28. var validUnits = map[string]Unit{
  29. string(Millisecond): Millisecond,
  30. string(Second): Second,
  31. string(Minute): Minute,
  32. string(Hour): Hour,
  33. string(Byte): Byte,
  34. string(KiB): KiB,
  35. string(MiB): MiB,
  36. string(GiB): GiB,
  37. string(MCPU): MCPU,
  38. string(VCPU): VCPU,
  39. string(GPU): GPU,
  40. string(GiBHour): GiBHour,
  41. string(VCPUHour): VCPUHour,
  42. string(GPUHour): GPUHour,
  43. }
  44. // ParseUnit parses a string into a Unit type.
  45. // It performs case-insensitive matching and returns an error if the string
  46. // does not match any valid unit.
  47. func ParseUnit(s string) (Unit, error) {
  48. for key, unit := range validUnits {
  49. if strings.EqualFold(key, s) {
  50. return unit, nil
  51. }
  52. }
  53. return "", fmt.Errorf("invalid unit: %q", s)
  54. }