@@ -104,6 +104,28 @@ defmodule Cocktail.Parser.ICalendar do
104104 end
105105 end
106106
107+ @ spec parse_datetimes_list ( String . t ( ) ) :: { :ok , [ Cocktail . time ( ) ] } | { :error , term }
108+ defp parse_datetimes_list ( time_string ) do
109+ with [ tzid , datetimes ] <- String . split ( time_string , ":" ) do
110+ datetimes
111+ |> String . split ( "," )
112+ |> Enum . map ( & ( "#{ tzid } :#{ & 1 } " ) )
113+ |> parse_datetimes_values ( [ ] )
114+ else
115+ _ ->
116+ { :error , :invalid_time_format }
117+ end
118+ end
119+
120+ @ spec parse_datetimes_values ( [ String . t ( ) ] , [ Cocktail . time ( ) ] ) :: { :ok , [ Cocktail . time ( ) ] } | { :error , term }
121+ defp parse_datetimes_values ( [ ] , datetimes_list ) , do: { :ok , datetimes_list }
122+
123+ defp parse_datetimes_values ( [ head | rest ] , datetimes_list ) do
124+ with { :ok , datetime } <- parse_datetime ( head ) do
125+ parse_datetimes_values ( rest , [ datetime | datetimes_list ] )
126+ end
127+ end
128+
107129 @ spec parse_naive_datetime ( String . t ( ) ) :: { :ok , NaiveDateTime . t ( ) } | { :error , term }
108130 defp parse_naive_datetime ( time_string ) , do: Timex . parse ( time_string , @ datetime_format )
109131
@@ -470,9 +492,12 @@ defmodule Cocktail.Parser.ICalendar do
470492
471493 @ spec parse_exdate ( String . t ( ) , Schedule . t ( ) , non_neg_integer ) :: { :ok , Schedule . t ( ) } | { :error , term }
472494 defp parse_exdate ( time_string , schedule , index ) do
473- case parse_datetime ( time_string ) do
474- { :ok , datetime } -> { :ok , Schedule . add_exception_time ( schedule , datetime ) }
475- { :error , term } -> { :error , { term , index } }
495+ case parse_datetimes_list ( time_string ) do
496+ { :ok , datetimes } ->
497+ { :ok , Enum . reduce ( datetimes , schedule , & ( Schedule . add_exception_time ( & 2 , & 1 ) ) ) }
498+
499+ { :error , term } ->
500+ { :error , { term , index } }
476501 end
477502 end
478503end
0 commit comments