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