use std::future::Future;
use std::pin::Pin;
use thiserror::Error;
use crate::models::*;
#[derive(Debug, Error)]
pub enum RegistryError {
#[error("http error: {0}")]
Http(#[from] reqwest::Error),
#[error("timeout")]
Timeout,
#[error("not found")]
NotFound,
#[error("rate limited")]
RateLimited,
#[error("parse error: {0}")]
Parse(String),
#[error("not supported")]
NotSupported,
}
pub type RegistryResult<T> = Result<T, RegistryError>;
pub trait Registry: Send + Sync {
fn id(&self) -> &str;
fn display_name(&self) -> &str;
fn get_package<'a>(
&'a self,
name: &'a str,
) -> Pin<Box<dyn Future<Output = RegistryResult<PackageInfo>> + Send + 'a>>;
fn get_versions<'a>(
&'a self,
name: &'a str,
) -> Pin<Box<dyn Future<Output = RegistryResult<Vec<VersionInfo>>> + Send + 'a>>;
fn search<'a>(
&'a self,
query: &'a str,
limit: usize,
) -> Pin<Box<dyn Future<Output = RegistryResult<Vec<SearchResult>>> + Send + 'a>>;
fn supports_latest_version(&self) -> bool {
true
}
}