magnetease 0.2.0

A library to fetch magnets from the internet
Documentation
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());
    }
}