defmodule Mix.Tasks.Kraken do
  use Mix.Task
  alias Kraken.Client
  @shortdoc "Kraken call, cast and stream."
  @moduledoc """
  Manipulates Kraken services.
  """
  def run(args) do
    {:ok, _pid} = Client.start_finch()
    case args do
      ["call", payload] ->
        "/call"
        |> Client.post(payload)
        |> print()
      ["cast", payload] ->
        "/cast"
        |> Client.post(payload)
        |> print()
      ["stream", payload] ->
        "/stream/"
        |> Client.stream(payload, &print/1)
      args ->
        IO.puts("Unknown command: #{Enum.join(args, " ")}")
    end
  end
  defp print(json) do
    json
    |> Jason.Formatter.pretty_print()
    |> IO.puts()
  end
end
defmodule Mix.Tasks.Kraken.Call do
  use Mix.Task
  @shortdoc "Kraken call"
  def run(payload) do
    Mix.Tasks.Kraken.run(["call", payload])
  end
end
defmodule Mix.Tasks.Kraken.Cast do
  use Mix.Task
  @shortdoc "Kraken cast"
  def run(payload) do
    Mix.Tasks.Kraken.run(["call", payload])
  end
end
defmodule Mix.Tasks.Kraken.Stream do
  use Mix.Task
  @shortdoc "Kraken stream"
  def run(payload) do
    Mix.Tasks.Kraken.run(["stream", payload])
  end
end