Current section
Files
Jump to
Current section
Files
lib/mix/tasks/condukt.workflows.serve.ex
defmodule Mix.Tasks.Condukt.Workflows.Serve do
@shortdoc "Serves Condukt workflows"
@moduledoc """
Starts a Condukt workflow runtime and blocks.
"""
use Mix.Task
alias Condukt.Workflows
alias Mix.Tasks.Condukt.Workflows.Helpers
@requirements ["app.start"]
@impl Mix.Task
def run(args) do
{opts, rest} = Helpers.parse!(args, root: :string, workflows: :string, port: :integer)
rest == [] || Mix.raise("Unexpected arguments: #{Enum.join(rest, " ")}")
root = root_from_opts(opts)
project = Helpers.load_project!(root)
port = Keyword.get(opts, :port, 4000)
case Workflows.serve(project, port: port) do
{:ok, _pid} ->
Mix.shell().info("Serving #{map_size(project.workflows)} workflow(s) on port #{port}")
Process.sleep(:infinity)
{:error, reason} ->
Mix.raise("Could not serve workflows: #{inspect(reason)}")
end
end
defp root_from_opts(opts) do
cond do
opts[:root] ->
Helpers.root(opts)
opts[:workflows] ->
workflows_root(opts[:workflows])
true ->
File.cwd!()
end
end
defp workflows_root(path) do
path = Path.expand(path)
if Path.basename(path) == "workflows" do
Path.dirname(path)
else
path
end
end
end