cover/Elixir.Utils.Yaml.html

1 defmodule Utils.Yaml do
2 import Enum, only: [map: 2]
3 import Jason, only: [decode: 1]
4 import Map, only: [new: 2]
5 import String, only: [replace_prefix: 3, to_atom: 1, replace: 3]
6 import Ymlr, only: [document!: 1]
7
8 def yaml(args) when is_map(args) do
9 51 express(args)
10 end
11
12 def yaml(args) when is_list(args) do
13 1 express(args)
14 end
15
16 def yaml(args) when is_binary(args) do
17 334 result = probe(args)
18 334 fallback(result, args)
19 end
20
21 286 def yaml(nil), do: nil
22
23
:-(
def yaml(args), do: "#{inspect(args)}"
24
25 52 defp express(args) do
26 52 render(args)
27 rescue
28 1 _ -> inspect(args)
29 end
30
31 defp render(args) do
32 args
33 |> atomize()
34 |> document!()
35 52 |> replace_prefix("---", "")
36 end
37
38 286 defp fallback(nil, args), do: args
39 48 defp fallback(result, _args), do: result
40
41 defp probe(args) do
42 334 first = json(args)
43 334 process(first, args)
44 end
45
46 defp process(nil, args) do
47 286 yaml(json(replaced(args)))
48 end
49
50 defp process(parsed, _args) do
51 48 yaml(parsed)
52 end
53
54 defp replaced(args) do
55 286 replace(args, "'", "\"")
56 end
57
58 defp json(args) do
59 620 decode(args) |> extract()
60 end
61
62 48 defp extract({:ok, json}), do: json
63 572 defp extract(_), do: nil
64
65 52 defp atomize(map) when is_map(map) do
66 52 new(map, fn {k, v} -> {to_atom(k), atomize(v)} end)
67 rescue
68
:-(
ArgumentError -> map
69 end
70
71 defp atomize(list) when is_list(list) do
72 57 map(list, fn item -> atomize(item) end)
73 end
74
75 286 defp atomize(value), do: value
76 end
Line Hits Source