use reqwest::Client;
use crate::{
providers::{knaben::Knaben, nyaa::Nyaa},
Magnet, MagneteaseError, Provider,
};
pub struct Magnetease {
client: Client,
providers: Vec<Box<dyn Provider + Send + Sync>>,
}
impl Default for Magnetease {
fn default() -> Self {
Self::new()
}
}
impl Magnetease {
pub fn new() -> Self {
Self {
client: Client::new(),
providers: vec![Box::new(Knaben), Box::new(Nyaa)],
}
}
}
impl Magnetease {
pub async fn search(&self, query: &str) -> Result<Vec<Magnet>, MagneteaseError> {
let mut results = Vec::new();
for provider in &self.providers {
let provider_results = provider.search(&self.client, query).await;
if let Ok(magnets) = provider_results {
results.extend(magnets);
}
}
results.sort_by(|a, b| a.seeders.cmp(&b.seeders));
Ok(results)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn magnetease_works() {
let magnetease = Magnetease::new();
let magnets = magnetease.search("minecraft").await.unwrap();
assert!(!magnets.is_empty());
}
}