validation.odin 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package datetime
  2. // Validation helpers
  3. is_leap_year :: proc "contextless" (#any_int year: i64) -> (leap: bool) {
  4. return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
  5. }
  6. validate_date :: proc "contextless" (date: Date) -> (err: Error) {
  7. return validate(date.year, date.month, date.day)
  8. }
  9. validate_year_month_day :: proc "contextless" (#any_int year, #any_int month, #any_int day: i64) -> (err: Error) {
  10. if year < MIN_DATE.year || year > MAX_DATE.year {
  11. return .Invalid_Year
  12. }
  13. if month < 1 || month > 12 {
  14. return .Invalid_Month
  15. }
  16. month_days := MONTH_DAYS
  17. days_this_month := month_days[month]
  18. if month == 2 && is_leap_year(year) {
  19. days_this_month = 29
  20. }
  21. if day < 1 || day > i64(days_this_month) {
  22. return .Invalid_Day
  23. }
  24. return .None
  25. }
  26. validate_ordinal :: proc "contextless" (ordinal: Ordinal) -> (err: Error) {
  27. if ordinal < MIN_ORD || ordinal > MAX_ORD {
  28. return .Invalid_Ordinal
  29. }
  30. return
  31. }
  32. validate_time :: proc "contextless" (time: Time) -> (err: Error) {
  33. return validate(time.hour, time.minute, time.second, time.nano)
  34. }
  35. validate_hour_minute_second :: proc "contextless" (#any_int hour, #any_int minute, #any_int second, #any_int nano: i64) -> (err: Error) {
  36. if hour < 0 || hour > 23 {
  37. return .Invalid_Hour
  38. }
  39. if minute < 0 || minute > 59 {
  40. return .Invalid_Minute
  41. }
  42. if second < 0 || second > 59 {
  43. return .Invalid_Second
  44. }
  45. if nano < 0 || nano > 1e9 {
  46. return .Invalid_Nano
  47. }
  48. return .None
  49. }
  50. validate_datetime :: proc "contextless" (using datetime: DateTime) -> (err: Error) {
  51. validate(date) or_return
  52. validate(time) or_return
  53. return .None
  54. }
  55. validate :: proc{
  56. validate_date,
  57. validate_year_month_day,
  58. validate_ordinal,
  59. validate_hour_minute_second,
  60. validate_time,
  61. validate_datetime,
  62. }