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