mod librespeed;
use std::sync::Arc;
use async_trait::async_trait;
use serde::Deserialize;
use crate::errors::EngineResult;
use super::models::Server;
pub use librespeed::{builtin_servers, parse_server_list, LibreSpeedProvider};
#[async_trait]
pub trait Provider: Send + Sync {
fn name(&self) -> &'static str;
async fn fetch_servers(&self) -> EngineResult<Vec<Server>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ProviderKind {
#[default]
Librespeed,
}
impl ProviderKind {
#[must_use]
pub fn label(self) -> &'static str {
match self {
Self::Librespeed => "LibreSpeed",
}
}
}
pub fn create(kind: ProviderKind, custom_servers: Vec<Server>) -> EngineResult<Arc<dyn Provider>> {
match kind {
ProviderKind::Librespeed => Ok(Arc::new(LibreSpeedProvider::new(custom_servers)?)),
}
}