@@ -131,6 +131,8 @@ defmodule Calendar.ISO do
131
131
unix_end = 315_569_519_999_999_999 - @ unix_epoch * 1_000_000
132
132
@ unix_range_microseconds unix_start .. unix_end
133
133
134
+ defguardp is_format ( term ) when term in [ :basic , :extended ]
135
+
134
136
@ typedoc """
135
137
"Before the Current Era" or "Before the Common Era" (BCE), for those years less than `1`.
136
138
"""
@@ -157,6 +159,7 @@ defmodule Calendar.ISO do
157
159
@ type second :: 0 .. 59
158
160
@ type weekday :: :monday | :tuesday | :wednesday | :thursday | :friday | :saturday | :sunday
159
161
@ type utc_offset :: integer
162
+ @ type format :: :basic | :extended
160
163
161
164
@ typedoc """
162
165
Microseconds with stored precision.
@@ -286,11 +289,15 @@ defmodule Calendar.ISO do
286
289
287
290
"""
288
291
@ doc since: "1.12.0"
289
- def parse_time ( "T" <> string , format ) ,
290
- do: do_parse_time ( string , format )
291
-
292
- def parse_time ( string , format ) when is_binary ( string ) ,
293
- do: do_parse_time ( string , format )
292
+ @ spec parse_time ( String . t ( ) , format ) ::
293
+ { :ok , { hour , minute , second , microsecond } }
294
+ | { :error , atom }
295
+ def parse_time ( string , format ) when is_binary ( string ) and is_format ( format ) do
296
+ case string do
297
+ "T" <> rest -> do_parse_time ( rest , format )
298
+ _ -> do_parse_time ( string , format )
299
+ end
300
+ end
294
301
295
302
defp do_parse_time ( << unquote ( match_basic_time ) , rest :: binary >> , :basic )
296
303
when unquote ( guard_time ) do
@@ -363,13 +370,19 @@ defmodule Calendar.ISO do
363
370
364
371
"""
365
372
@ doc since: "1.12.0"
366
- def parse_date ( "-" <> string , format ) ,
373
+ @ spec parse_date ( String . t ( ) , format ) ::
374
+ { :ok , { year , month , day } }
375
+ | { :error , atom }
376
+ def parse_date ( string , format ) when is_binary ( string ) and is_format ( format ) ,
377
+ do: parse_date_guarded ( string , format )
378
+
379
+ defp parse_date_guarded ( "-" <> string , format ) ,
367
380
do: do_parse_date ( string , - 1 , format )
368
381
369
- def parse_date ( "+" <> string , format ) ,
382
+ defp parse_date_guarded ( "+" <> string , format ) ,
370
383
do: do_parse_date ( string , 1 , format )
371
384
372
- def parse_date ( string , format ) when is_binary ( string ) ,
385
+ defp parse_date_guarded ( string , format ) ,
373
386
do: do_parse_date ( string , 1 , format )
374
387
375
388
defp do_parse_date ( unquote ( match_basic_date ) , multiplier , :basic ) when unquote ( guard_date ) do
@@ -442,13 +455,19 @@ defmodule Calendar.ISO do
442
455
443
456
"""
444
457
@ doc since: "1.12.0"
445
- def parse_naive_datetime ( "-" <> string , format ) ,
458
+ @ spec parse_naive_datetime ( String . t ( ) , format ) ::
459
+ { :ok , { year , month , day , hour , minute , second , microsecond } }
460
+ | { :error , atom }
461
+ def parse_naive_datetime ( string , format ) when is_binary ( string ) and is_format ( format ) ,
462
+ do: parse_naive_datetime_guarded ( string , format )
463
+
464
+ defp parse_naive_datetime_guarded ( "-" <> string , format ) ,
446
465
do: do_parse_naive_datetime ( string , - 1 , format )
447
466
448
- def parse_naive_datetime ( "+" <> string , format ) ,
467
+ defp parse_naive_datetime_guarded ( "+" <> string , format ) ,
449
468
do: do_parse_naive_datetime ( string , 1 , format )
450
469
451
- def parse_naive_datetime ( string , format ) when is_binary ( string ) ,
470
+ defp parse_naive_datetime_guarded ( string , format ) ,
452
471
do: do_parse_naive_datetime ( string , 1 , format )
453
472
454
473
defp do_parse_naive_datetime (
@@ -540,13 +559,19 @@ defmodule Calendar.ISO do
540
559
541
560
"""
542
561
@ doc since: "1.12.0"
543
- def parse_utc_datetime ( "-" <> string , format ) ,
562
+ @ spec parse_utc_datetime ( String . t ( ) , format ) ::
563
+ { :ok , { year , month , day , hour , minute , second , microsecond } , utc_offset }
564
+ | { :error , atom }
565
+ def parse_utc_datetime ( string , format ) when is_binary ( string ) and is_format ( format ) ,
566
+ do: parse_utc_datetime_guarded ( string , format )
567
+
568
+ defp parse_utc_datetime_guarded ( "-" <> string , format ) ,
544
569
do: do_parse_utc_datetime ( string , - 1 , format )
545
570
546
- def parse_utc_datetime ( "+" <> string , format ) ,
571
+ defp parse_utc_datetime_guarded ( "+" <> string , format ) ,
547
572
do: do_parse_utc_datetime ( string , 1 , format )
548
573
549
- def parse_utc_datetime ( string , format ) when is_binary ( string ) ,
574
+ defp parse_utc_datetime_guarded ( string , format ) ,
550
575
do: do_parse_utc_datetime ( string , 1 , format )
551
576
552
577
defp do_parse_utc_datetime (
0 commit comments