defmodule Mix.Tasks.Smuggle do
@moduledoc ~S"""
ConfigSmuggler provides the `mix smuggle` task, which encodes
`config.exs`-style files into JSON-formatted key/value pairs.
Usage: `mix smuggle encode <filename.exs>`
"""
use Mix.Task
defp insp(v), do: ConfigSmuggler.Encoder.encode_value(v)
@impl true
@shortdoc "Encodes a config.exs-style file into JSON keys and values"
def run(["encode", filename]) do
with {:ok, encoded_config_map} <- ConfigSmuggler.encode_file(filename) do
cond do
Code.ensure_loaded?(Jason) ->
encoded_config_map
|> Jason.encode!()
|> IO.puts()
Code.ensure_loaded?(Poison) ->
encoded_config_map
|> Poison.encode!()
|> IO.puts()
:else ->
data =
encoded_config_map
|> Enum.map(fn {k, v} -> "#{insp(k)}:#{insp(v)}" end)
|> Enum.join(",")
IO.puts("{" <> data <> "}")
end
else
{:error, reason} ->
Mix.shell().error("Error: #{insp(reason)}")
System.halt(1)
end
end
def run(_args) do
Mix.shell().error("Usage: mix smuggle encode <filename.exs>")
System.halt(1)
end
end