nako-metadata-scraper 0.1.0-alpha.2

Official Nako metadata scraper Addon Sidecar.
Documentation
use std::{
    collections::VecDeque,
    sync::{Arc, Mutex},
};

use async_trait::async_trait;

use crate::providers::http_runtime::{
    ProviderHttpError, ProviderHttpRequest, ProviderHttpResponse, ProviderHttpResult,
    ProviderHttpRuntimeConfig, ProviderHttpTransport,
};

use super::DOUBAN_PROVIDER_ID;

#[derive(Clone, Default)]
pub(super) struct FakeTransport {
    responses: Arc<Mutex<VecDeque<ProviderHttpResult<ProviderHttpResponse>>>>,
    requests: Arc<Mutex<Vec<ProviderHttpRequest>>>,
}

impl FakeTransport {
    pub(super) fn push_rendered_html(&self, url: &str, title: &str, html: &str) {
        self.responses
            .lock()
            .unwrap()
            .push_back(Ok(ProviderHttpResponse {
                status: 200,
                body: serde_json::json!({
                    "status": "ok",
                    "url": url,
                    "title": title,
                    "html": html,
                    "text": html,
                    "excerpt": html.chars().take(240).collect::<String>()
                })
                .to_string()
                .into_bytes(),
            }));
    }

    pub(super) fn requests(&self) -> Vec<ProviderHttpRequest> {
        self.requests.lock().unwrap().clone()
    }
}

#[async_trait]
impl ProviderHttpTransport for FakeTransport {
    async fn send(
        &self,
        request: ProviderHttpRequest,
        _config: ProviderHttpRuntimeConfig,
    ) -> ProviderHttpResult<ProviderHttpResponse> {
        self.requests.lock().unwrap().push(request);
        self.responses
            .lock()
            .unwrap()
            .pop_front()
            .unwrap_or_else(|| {
                Err(ProviderHttpError::Transport {
                    provider_id: DOUBAN_PROVIDER_ID,
                    operation: "fake",
                    message: "fake transport response queue was empty".to_owned(),
                    attempts: 0,
                })
            })
    }
}