cover/Elixir.Cfg.html

1 defmodule Cfg do
2 import Enum, only: [map: 2, reject: 2, reduce: 3]
3 import Map, only: [new: 1, put: 3, put_new: 3]
4 import String, only: [split: 2, split: 3, trim: 1, to_atom: 1]
5 import Utils.File, only: [file: 1]
6 import YamlElixir, only: [read_from_string: 1]
7
8 def config(name) do
9 163 file("#{name}.md")
10 |> valid(name)
11 163 |> finalize(name)
12 end
13
14 163 defp finalize(md, name), do: md |> parse() |> tools() |> includes() |> default(name: name)
15
16
:-(
defp valid("file not found: " <> _, name), do: raise(RuntimeError, "unknown agent: #{name}")
17 163 defp valid(md, _), do: md
18
19 defp tools(%{tools: raw} = config) when is_binary(raw) do
20 71 list = split(raw, ",") |> map(&trim/1) |> reject(&empty/1)
21 71 put(config, :tools, list)
22 end
23
24 92 defp tools(config), do: config
25
26 defp includes(%{includes: raw} = config) when is_binary(raw) do
27 24 list = split(raw, ",") |> map(&trim/1) |> reject(&empty/1)
28 24 put(config, :includes, list)
29 end
30
31 139 defp includes(config), do: config
32
33
:-(
defp empty(""), do: true
34 186 defp empty(_), do: false
35
36 defp parse(md) do
37 md
38 |> split("---", parts: 3)
39 163 |> join(md)
40 end
41
42 defp parse(header, body) do
43 header
44 141 |> then(&suppress(fn -> read_from_string(&1) end))
45 141 |> join(body)
46 end
47
48 defp suppress(fun) do
49 141 fun.()
50 end
51
52 141 defp join(["", header, body], _), do: parse(header, body)
53 141 defp join({:ok, header}, body), do: build(header, body)
54 22 defp join(_, md), do: %{content: md}
55
56 defp build(header, body) do
57 header
58 |> map(&props/1)
59 |> new()
60 141 |> put(:content, trim(body))
61 end
62
63 329 defp props({k, v}), do: {to_atom(k), v}
64
65 defp default(config, defaults) do
66 163 reduce(defaults, config, fn {key, value}, acc ->
67 163 put_new(acc, key, value)
68 end)
69 end
70 end
Line Hits Source