class KPM::NexusFacade::Actions

def derived_error_message(errors, exception)

def derived_error_message(errors, exception)
  key = (errors.keys & exception.class.ancestors).first
  (key ? errors[key] : nil) || exception.message
end

def get_artifact_info(coordinates)

def get_artifact_info(coordinates)
  retry_exceptions("get_artifact_info #{coordinates}") { nexus_api_call.get_artifact_info(coordinates) }
end

def initialize(overrides, ssl_verify, logger)

def initialize(overrides, ssl_verify, logger)
  overrides ||= {}
  overrides[:url] ||= 'https://repo1.maven.org/maven2'
  overrides[:repository] ||= 'releases'
  @logger = logger
  logger.level = Logger::INFO
  @nexus_api_call = if overrides[:url].start_with?('https://maven.pkg.github.com')
                      GithubApiCalls.new(overrides, ssl_verify, logger)
                    elsif overrides[:url].start_with?('https://dl.cloudsmith.io')
                      CloudsmithApiCalls.new(overrides, ssl_verify, logger)
                    elsif overrides[:url].start_with?('https://repo1.maven.org')
                      MavenCentralApiCalls.new(overrides, ssl_verify, logger)
                    else
                      NexusApiCallsV2.new(overrides, ssl_verify, logger)
                    end
end

def pull_artifact(coordinates, destination = nil)

def pull_artifact(coordinates, destination = nil)
  retry_exceptions("pull_artifact #{coordinates}") { nexus_api_call.pull_artifact(coordinates, destination) }
end

def retry_exceptions(tag)

def retry_exceptions(tag)
  retries = DEFAULT_RETRIES
  begin
    yield
  rescue *DEFAULT_CONNECTION_ERRORS.keys => e
    retries -= 1
    @logger.warn(format('Transient error during %<tag>s, retrying (attempt=%<attempt>d): %<msg>s', tag: tag, attempt: DEFAULT_RETRIES - retries, msg: derived_error_message(DEFAULT_CONNECTION_ERRORS, e)))
    retry unless retries.zero?
    raise
  end
end

def search_for_artifacts(coordinates)

def search_for_artifacts(coordinates)
  retry_exceptions("search_for_artifacts #{coordinates}") { nexus_api_call.search_for_artifacts(coordinates) }
end