Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions lib/magical/alarm.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule Magical.Alarm do
@moduledoc """
A representation of a iCalendar VALARM
"""

defstruct uid: nil,
acknowledged: nil,
action: nil,
description: nil,
trigger: nil,
x_wr_alarm_uid: nil,
x_apple_default_alarm: nil


@type t :: %__MODULE__{
uid: String.t(),
acknowledged: DateTime.t(),
action: String.t(),
description: String.t(),
trigger: Duration.t() | DateTime.t(),
x_wr_alarm_uid: String.t(),
x_apple_default_alarm: boolean() | nil
}
end
6 changes: 4 additions & 2 deletions lib/magical/event.ex
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ defmodule Magical.Event do
rstatus: nil,
related: nil,
resources: nil,
rdate: nil
rdate: nil,
alarm: nil

@type t :: %__MODULE__{
uid: String.t(),
Expand Down Expand Up @@ -62,6 +63,7 @@ defmodule Magical.Event do
rstatus: String.t(),
related: String.t(),
resources: String.t(),
rdate: String.t()
rdate: String.t(),
alarm: Magical.Alarm.t()
}
end
53 changes: 53 additions & 0 deletions lib/magical/parser/alarm_parser.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
defmodule Magical.Parser.AlarmParser do
@moduledoc false

alias Magical.Alarm
alias Magical.Parser.DateParser
alias Magical.Parser.TextParser
alias Magical.Parser.DurationParser

def parse(lines) do
Enum.reduce(lines, %Alarm{}, &parse_alarm/2)
end

defp parse_alarm({"uid", uid, _args}, alarm) do
Map.put(alarm, :uid, TextParser.parse(uid))
end

defp parse_alarm({"x-wr-alarmuid", uid, _args}, alarm) do
Map.put(alarm, :x_wr_alarm_uid, TextParser.parse(uid))
end

defp parse_alarm({"acknowledged", datetime, args}, alarm) do
Map.put(alarm, :acknowledged, DateParser.parse(datetime, args))
end

defp parse_alarm({"action", action, _args}, alarm) do
Map.put(alarm, :action, TextParser.parse(action))
end

defp parse_alarm({"description", description, _args}, alarm) do
Map.put(alarm, :action, TextParser.parse(description))
end

defp parse_alarm({"trigger", trigger, args}, alarm) do
Map.put(alarm, :trigger, DurationParser.parse(trigger, args))
end

defp parse_alarm({"x-apple-default-alarm", "TRUE", _args}, alarm) do
Map.put(alarm, :x_apple_default_alarm, true)
end

defp parse_alarm({"x-apple-default-alarm", "FALSE", _args}, alarm) do
Map.put(alarm, :x_apple_default_alarm, false)
end

defp parse_alarm({"x-apple-default-alarm", _, _args}, alarm) do
Map.put(alarm, :x_apple_default_alarm, nil)
end

defp parse_alarm({"end", "VALARM", _args}, alarm) do
alarm
end

end
21 changes: 21 additions & 0 deletions lib/magical/parser/duration_parser.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
defmodule Magical.Parser.DurationParser do
@moduledoc """
Responsible for parsing durations or delegating to
datetime parsing.
"""

alias Magical.Parser.DateParser

def parse("P" <> _rest = duration_string, _args) do
Duration.from_iso8601!(duration_string)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The convention that I created within the DateParser was that if a field was not parseable that it should be left as nil

Suggested change
Duration.from_iso8601!(duration_string)
Duration.from_iso8601(duration_string)
|> case do
{:ok, duration} -> duration
error -> nil
end

end

def parse("-P" <> _rest = duration_string, _args) do
Duration.from_iso8601!(duration_string)
end

def parse(datetime_string, args) do
DateParser.parse(datetime_string, args)
end

end
6 changes: 5 additions & 1 deletion lib/magical/parser/event_parser.ex
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
defmodule Magical.Parser.EventParser do
@moduledoc false

alias Magical.Parser.TextParser
alias Magical.Event
alias Magical.Parser.TextParser
alias Magical.Parser.DateParser
alias Magical.Parser.AlarmParser

def parse(lines) do
Enum.reduce(lines, %Event{}, &parse_event/2)
Expand All @@ -27,6 +28,9 @@ defmodule Magical.Parser.EventParser do
defp parse_event({"created", created, _}, event),
do: Map.put(event, :created, DateParser.parse(created, %{}))

defp parse_event([{"begin", "VALARM", _} | alarm], event),
do: Map.put(event, :alarm, AlarmParser.parse(alarm))

defp parse_event({field, value, _}, event) do
keys =
Magical.Event.__struct__()
Expand Down
Loading