diff options
Diffstat (limited to 'lib/irc/parser/isupport.ex')
-rw-r--r-- | lib/irc/parser/isupport.ex | 41 |
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 |