Browse Source

More better validation.

Jeroen van Rijn 1 year ago
parent
commit
fda283c55e
2 changed files with 19 additions and 17 deletions
  1. 10 13
      core/time/datetime/datetime.odin
  2. 9 4
      core/time/datetime/validation.odin

+ 10 - 13
core/time/datetime/datetime.odin

@@ -15,7 +15,8 @@ date_to_ordinal :: proc "contextless" (date: Date) -> (ordinal: Ordinal, err: Er
 }
 
 components_to_ordinal :: proc "contextless" (#any_int year, #any_int month, #any_int day: i64) -> (ordinal: Ordinal, err: Error) {
-	return date_to_ordinal(Date{year, i8(month), i8(day)})
+	validate(year, month, day) or_return
+	return unsafe_date_to_ordinal({year, i8(month), i8(day)}), .None
 }
 
 // Procedures that return a Date
@@ -26,15 +27,13 @@ ordinal_to_date :: proc "contextless" (ordinal: Ordinal) -> (date: Date, err: Er
 }
 
 components_to_date :: proc "contextless" (#any_int year, #any_int month, #any_int day: i64) -> (date: Date, err: Error) {
-	date = Date{i64(year), i8(month), i8(day)}
-	validate(date) or_return
-	return date, .None
+	validate(year, month, day) or_return
+	return Date{i64(year), i8(month), i8(day)}, .None
 }
 
 components_to_time :: proc "contextless" (#any_int hour, #any_int minute, #any_int second: i64, #any_int nanos := i64(0)) -> (time: Time, err: Error) {
-	time = Time{i8(hour), i8(minute), i8(second), i32(nanos)}
-	validate(time) or_return
-	return time, .None
+	validate(hour, minute, second, nanos) or_return
+	return Time{i8(hour), i8(minute), i8(second), i32(nanos)}, .None
 }
 
 components_to_datetime :: proc "contextless" (#any_int year, #any_int month, #any_int day, #any_int hour, #any_int minute, #any_int second: i64, #any_int nanos := i64(0)) -> (datetime: DateTime, err: Error) {
@@ -142,15 +141,13 @@ last_day_of_month :: proc "contextless" (#any_int year: i64, #any_int month: i8)
 }
 
 new_year :: proc "contextless" (#any_int year: i64) -> (new_year: Date, err: Error) {
-	new_year = {year, 1, 1}
-	validate(new_year) or_return
-	return
+	validate(year, 1, 1) or_return
+	return {year, 1, 1}, .None
 }
 
 year_end :: proc "contextless" (#any_int year: i64) -> (year_end: Date, err: Error) {
-	year_end = {year, 12, 31}
-	validate(year_end) or_return
-	return
+	validate(year, 12, 31) or_return
+	return {year, 12, 31}, .None
 }
 
 year_range :: proc (#any_int year: i64, allocator := context.allocator) -> (range: []Date) {

+ 9 - 4
core/time/datetime/validation.odin

@@ -37,16 +37,20 @@ validate_ordinal :: proc "contextless" (ordinal: Ordinal) -> (err: Error) {
 }
 
 validate_time :: proc "contextless" (time: Time) -> (err: Error) {
-	if time.hour < 0 || time.hour > 23 {
+	return validate(time.hour, time.minute, time.second, time.nano)
+}
+
+validate_hour_minute_second :: proc "contextless" (#any_int hour, #any_int minute, #any_int second, #any_int nano: i64) -> (err: Error) {
+	if hour < 0 || hour > 23 {
 		return .Invalid_Hour
 	}
-	if time.minute < 0 || time.minute > 59 {
+	if minute < 0 || minute > 59 {
 		return .Invalid_Minute
 	}
-	if time.second < 0 || time.second > 59 {
+	if second < 0 || second > 59 {
 		return .Invalid_Second
 	}
-	if time.nano < 0 || time.nano > 1e9 {
+	if nano < 0 || nano > 1e9 {
 		return .Invalid_Nano
 	}
 	return .None
@@ -62,6 +66,7 @@ validate :: proc{
 	validate_date,
 	validate_year_month_day,
 	validate_ordinal,
+	validate_hour_minute_second,
 	validate_time,
 	validate_datetime,
 }