lib/mix/tasks/services.ex

defmodule Mix.Tasks.Kraken.Services do
  use Mix.Task
  alias Kraken.Client

  @shortdoc "Manipulates Kraken services."

  @moduledoc """
  Manipulates Kraken services.
  """

  def run(args) do
    {:ok, _pid} = Client.start_finch()

    case args do
      [] ->
        "/services"
        |> Client.get()
        |> print()

      ["define", payload] ->
        "/services/define"
        |> Client.post(payload)
        |> print()

      ["status", name] ->
        "/services/status/#{name}"
        |> Client.get()
        |> print()

      ["state", name] ->
        "/services/state/#{name}"
        |> Client.get()
        |> print()

      ["definition", name] ->
        "/services/definition/#{name}"
        |> Client.get()
        |> print()

      ["start", name] ->
        "/services/start/#{name}"
        |> Client.post("")
        |> print()

      ["start", name, payload] ->
        "/services/start/#{name}"
        |> Client.post(payload)
        |> print()

      ["stop", name] ->
        "/services/stop/#{name}"
        |> Client.post("")
        |> print()

      ["stop", name, payload] ->
        "/services/stop/#{name}"
        |> Client.post(payload)
        |> print()

      ["delete", name] ->
        "/services/delete/#{name}"
        |> Client.post("")
        |> print()

      ["call", service, function, payload] ->
        "/services/call/#{service}/#{function}"
        |> Client.post(payload)
        |> print()

      args ->
        IO.puts("Unknown command: #{Enum.join(args, " ")}")
    end
  end

  defp print(json) do
    json
    |> Jason.Formatter.pretty_print()
    |> IO.puts()
  end
end