summaryrefslogtreecommitdiff
path: root/lib/irc/parser/isupport.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irc/parser/isupport.ex')
-rw-r--r--lib/irc/parser/isupport.ex41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/irc/parser/isupport.ex b/lib/irc/parser/isupport.ex
new file mode 100644
index 0000000..9dd7f30
--- /dev/null
+++ b/lib/irc/parser/isupport.ex
@@ -0,0 +1,41 @@
+defmodule Irc.Parser.Isupport do
+ @moduledoc """
+ ISUPPORT list parser
+ """
+
+ def parse(list, acc \\ %{}) do
+ list = List.flatten(list)
+ Enum.reduce(list, acc, fn(entry, acc) ->
+ case String.split(entry, "=", parts: 2) do
+ [entry] ->
+ if String.contains?(entry, " ") do
+ acc
+ else
+ Map.put(acc, entry, true)
+ end
+ [entry, value] -> Map.put(acc, entry, parse_value(value))
+ end
+ end)
+ end
+
+ defp parse_value(value) do
+ if String.contains?(value, ":") do
+ Enum.reduce(String.split(value, ","), %{}, fn(key_and_value, acc) ->
+ case String.split(key_and_value, ":", parts: 2) do
+ [key] -> Map.put(acc, key, nil)
+ [key, value] -> Map.put(acc, key, format_value(value))
+ end
+ end)
+ else
+ format_value(value)
+ end
+ end
+
+ def format_value(value) do
+ case Integer.parse(value) do
+ {i, ""} -> i
+ _ -> value
+ end
+ end
+
+end