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