Skip to content

Commit 34fe57f

Browse files
feat: merge peek-travel#213
1 parent 945de3d commit 34fe57f

2 files changed

Lines changed: 52 additions & 3 deletions

File tree

lib/cocktail/parser/i_calendar.ex

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
478503
end

test/cocktail/parser/i_calendar_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,30 @@ defmodule Cocktail.Parser.ICalendarTest do
139139
assert datetime == ~N[2017-01-01 06:00:00]
140140
end
141141

142+
test "parses a schedule with an EXDATE list" do
143+
schedule_string = """
144+
DTSTART:20170101T060000
145+
EXDATE:20170101T060000,20170102T060000
146+
"""
147+
148+
assert {:ok, schedule} = parse(schedule_string)
149+
assert [%NaiveDateTime{} = first_datetime, %NaiveDateTime{} = second_datetime] = schedule.exception_times
150+
assert first_datetime == ~N[2017-01-01 06:00:00]
151+
assert second_datetime == ~N[2017-01-02 06:00:00]
152+
end
153+
154+
test "parses a schedule with an EXDATE list and a TZID" do
155+
schedule_string = """
156+
DTSTART;TZID=America/Los_Angeles:20170101T060000
157+
EXDATE;TZID=America/Los_Angeles:20170101T060000,20170102T060000
158+
"""
159+
160+
assert {:ok, schedule} = parse(schedule_string)
161+
assert [%DateTime{} = first_datetime, %DateTime{} = second_datetime] = schedule.exception_times
162+
assert first_datetime == ~Y[2017-01-01 06:00:00 America/Los_Angeles]
163+
assert second_datetime == ~Y[2017-01-02 06:00:00 America/Los_Angeles]
164+
end
165+
142166
##########
143167
# Errors #
144168
##########

0 commit comments

Comments
 (0)