lib/minio/config.ex

defmodule MinioServer.Config do
  @moduledoc """
  Handles server and client versions and their local locations.
  """
  alias MinioServer.CpuInfo
  @doc "A list of all the available architectures downloadable."
  @spec available_architectures :: [MinioServer.architecture()]
  def available_architectures do
    [
      "darwin-amd64",
      "darwin-arm64",
      "linux-amd64",
      "linux-arm",
      "linux-arm64",
      "windows-amd64"
    ]
  end

  ####### SERVER ########
  server_versions_file =
    Application.compile_env(:minio_server, :versions_file, "versions-server.json")

  @external_resource server_versions_file
  @server_versions server_versions_file
                   |> File.read!()
                   |> Jason.decode!()
  def server_versions do
    @server_versions
  end

  @doc "A list of all the available versions of minio."
  @spec available_server_versions :: [MinioServer.version()]
  def available_server_versions do
    @server_versions |> Map.keys() |> Enum.sort(:desc)
  end

  @doc "The most recent available version of minio."
  @spec most_recent_server_version :: MinioServer.version()
  def most_recent_server_version() do
    List.first(available_server_versions())
  end

  ####### CLIENT ########

  client_versions_file =
    Application.compile_env(:minio_server, :versions_file, "versions-client.json")

  @external_resource client_versions_file
  @client_versions client_versions_file
                   |> File.read!()
                   |> Jason.decode!()

  def client_versions do
    @client_versions
  end

  @doc "A list of all the available versions of minio."
  @spec available_client_versions :: [MinioServer.version()]
  def available_client_versions do
    @client_versions |> Map.keys() |> Enum.sort(:desc)
  end

  @doc "The most recent available version of minio."
  @spec most_recent_client_version :: MinioServer.version()
  def most_recent_client_version() do
    List.first(available_client_versions())
  end

  ### Arch + executable path

  @doc "Path to the executable binaries downloaded."
  @spec executable_path(MinioServer.architecture()) :: Path.t()
  def executable_path(arch, binary \\ "minio") do
    Application.app_dir(:minio_server, "priv/minio/#{arch}/#{binary}")
  end

  @doc "Path to the executable binaries of the systems architecture"
  @spec minio_executable :: Path.t()
  def minio_executable do
    executable_path(minio_arch())
  end

  defp minio_arch do
    case {CpuInfo.os_type(), CpuInfo.cpu_type()} do
      {:macos, "arm64"} -> "darwin-arm64"
      {:macos, _} -> "darwin-amd64"
      {:windows, _} -> "windows-amd64"
      {:linux, _} -> "linux-amd64"
    end
  end
end