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 + | 
