class AnyCableRailsGenerators::DownloadGenerator

Downloads anycable-go binary

def download_bin

def download_bin
  out = options[:bin_path] || DEFAULT_BIN_PATH
  version = options[:version] || VERSION
  download_exe(
    release_url(version),
    to: out,
    file_name: "anycable-go"
  )
  true
end

def download_exe(url, to:, file_name:)

def download_exe(url, to:, file_name:)
  file_path = File.join(to, file_name)
  FileUtils.mkdir_p(to) unless File.directory?(to)
  run "#{sudo(to)}curl -L #{url} -o #{file_path}", abort_on_failure: true
  run "#{sudo(to)}chmod +x #{file_path}", abort_on_failure: true
  run "#{file_path} -v", abort_on_failure: true
end

def latest_release_url(version)

def latest_release_url(version)
  "https://github.com/anycable/anycable-go/releases/latest/download/" \
    "anycable-go-#{os_name}-#{cpu_name}"
end

def legacy_release_url(version)

def legacy_release_url(version)
  "https://github.com/anycable/anycable-go/releases/download/#{version}/" \
    "anycable-go-v#{version}-#{os_name}-#{cpu_name}"
end

def new_release_url(version)

def new_release_url(version)
  "https://github.com/anycable/anycable-go/releases/download/#{version}/" \
    "anycable-go-#{os_name}-#{cpu_name}"
end

def release_url(version)

def release_url(version)
  return latest_release_url(version) if version == "latest"
  if Gem::Version.new(version).segments.first >= 1
    new_release_url("v#{version}")
  else
    legacy_release_url("v#{version}")
  end
end

def sudo(path)

def sudo(path)
  sudo = ""
  unless File.writable?(path)
    if yes? "Path is not writable 😕. Do you have sudo privileges?"
      sudo = "sudo "
    else
      say_status :error, "❌ Failed to install AnyCable-Go WebSocket server", :red
      raise StandardError, "Path #{path} is not writable!"
    end
  end
  sudo
end