2021-03-17 08:53:44 +08:00
|
|
|
defmodule LivebookCLI do
|
|
|
|
@moduledoc false
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
def usage() do
|
|
|
|
"""
|
|
|
|
Usage: livebook [command] [options]
|
|
|
|
|
|
|
|
Available commands:
|
|
|
|
|
|
|
|
livebook server Starts the Livebook web application
|
|
|
|
|
|
|
|
The --help and --version options can be given instead of a command for usage and versioning information.
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2021-03-17 08:53:44 +08:00
|
|
|
def main(args) do
|
|
|
|
{:ok, _} = Application.ensure_all_started(:elixir)
|
|
|
|
:ok = Application.load(:livebook)
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
if unix?() do
|
|
|
|
Application.put_env(:elixir, :ansi_enabled, true)
|
2021-03-17 08:53:44 +08:00
|
|
|
end
|
2021-04-08 17:41:52 +08:00
|
|
|
|
|
|
|
call(args)
|
2021-03-17 08:53:44 +08:00
|
|
|
end
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp unix?(), do: match?({:unix, _}, :os.type())
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp call([arg]) when arg in ["--help", "-h"], do: display_help()
|
|
|
|
defp call([arg]) when arg in ["--version", "-v"], do: display_version()
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp call([task_name | args]) do
|
|
|
|
case find_task(task_name) do
|
|
|
|
nil ->
|
|
|
|
IO.ANSI.format([:red, "Unknown command #{task_name}\n"]) |> IO.puts()
|
|
|
|
IO.write(usage())
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
task ->
|
|
|
|
call_task(task, args)
|
2021-03-17 08:53:44 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp call(_args), do: IO.write(usage())
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp find_task("server"), do: LivebookCLI.Server
|
|
|
|
defp find_task(_), do: nil
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp call_task(task, [arg]) when arg in ["--help", "-h"] do
|
|
|
|
IO.write(task.usage())
|
|
|
|
end
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp call_task(task, args) do
|
|
|
|
try do
|
|
|
|
task.call(args)
|
|
|
|
rescue
|
2021-12-09 22:44:23 +08:00
|
|
|
error in OptionParser.ParseError ->
|
|
|
|
IO.ANSI.format([
|
|
|
|
:red,
|
|
|
|
Exception.message(error),
|
|
|
|
"\n\nFor more information try --help"
|
|
|
|
])
|
|
|
|
|> IO.puts()
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
error ->
|
2021-12-09 22:44:23 +08:00
|
|
|
IO.ANSI.format([:red, Exception.format(:error, error, __STACKTRACE__), "\n"]) |> IO.puts()
|
2021-04-08 17:41:52 +08:00
|
|
|
end
|
|
|
|
end
|
2021-03-17 08:53:44 +08:00
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp display_help() do
|
|
|
|
IO.puts("Livebook is an interactive notebook system for Elixir\n")
|
|
|
|
IO.write(usage())
|
2021-03-17 08:53:44 +08:00
|
|
|
end
|
|
|
|
|
2021-04-08 17:41:52 +08:00
|
|
|
defp display_version() do
|
2021-03-17 08:53:44 +08:00
|
|
|
IO.puts(:erlang.system_info(:system_version))
|
|
|
|
IO.puts("Elixir " <> System.build_info()[:build])
|
|
|
|
|
|
|
|
version = Application.spec(:livebook, :vsn)
|
|
|
|
IO.puts("\nLivebook #{version}")
|
|
|
|
end
|
|
|
|
end
|