1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
|