summaryrefslogtreecommitdiff
path: root/lib/irc/parser/capabs.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irc/parser/capabs.ex')
-rw-r--r--lib/irc/parser/capabs.ex32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/irc/parser/capabs.ex b/lib/irc/parser/capabs.ex
new file mode 100644
index 0000000..88bf017
--- /dev/null
+++ b/lib/irc/parser/capabs.ex
@@ -0,0 +1,32 @@
+defmodule Irc.Parser.Capabs do
+ @moduledoc "Helper to parse capability lists"
+
+ @spec parse(String.t) :: %{capab :: String.t => true | args :: Map.t}
+ def parse(string) do
+ string
+ |> String.split(" ")
+ |> Enum.map(&parse_capab/1)
+ |> Enum.into(Map.new)
+ end
+
+ defp parse_capab(string) do
+ case String.split(string, "=", parts: 2) do
+ [capab] ->
+ {capab, true}
+ [capab, args] ->
+ parse_capab_with_args(capab, args)
+ end
+ end
+
+ defp parse_capab_with_args(capab, args) do
+ args = args
+ |> String.split(",")
+ |> Map.reduce(%{}, fn(k_v, acc) ->
+ [k, v] = String.split(k_v, "=")
+ Map.put(acc, k, v)
+ end)
+ {capab, args}
+ end
+
+end
+