defmodule Mix.Tasks.Quackdb.Install do @moduledoc """ Downloads DuckDB's official CLI binary for local QuackDB servers. mix quackdb.install mix quackdb.install --version 1.5.3 --force mix quackdb.install --target linux-amd64 --print-path The binary is cached under the user's cache directory by default. Set `QUACKDB_BINARY_CACHE_DIR` or pass `--cache-dir` to choose another location. """ use Mix.Task @shortdoc "Downloads a DuckDB CLI binary for QuackDB.Server" @impl Mix.Task def run(args) do {options, _argv, invalid} = OptionParser.parse(args, strict: [ version: :string, target: :string, base_url: :string, cache_dir: :string, sha256: :string, force: :boolean, print_path: :boolean ], aliases: [p: :print_path] ) case invalid do [] -> install(options) invalid -> Mix.raise("invalid options: #{inspect(invalid)}") end end defp install(options) do Mix.Task.run("app.start") case QuackDB.Binary.install(options) do {:ok, path} -> report_path(path, options) {:error, error} -> Mix.raise(Exception.message(error)) end end defp report_path(path, options) do if Keyword.get(options, :print_path, false) do Mix.shell().info(path) else Mix.shell().info("DuckDB installed at #{path}") end end end