muffy 0.3.21

The static website validator
Documentation
use crate::{Config, document_output::DocumentOutput, error::Error};
use scc::HashSet;
use tokio::sync::mpsc::Sender;

const INITIAL_DOCUMENT_CAPACITY: usize = 1 << 10;

pub struct Context {
    documents: HashSet<String>,
    job_sender: Sender<Box<dyn Future<Output = Result<DocumentOutput, Error>> + Send>>,
    config: Config,
}

impl Context {
    pub fn new(
        job_sender: Sender<Box<dyn Future<Output = Result<DocumentOutput, Error>> + Send>>,
        config: Config,
    ) -> Self {
        Self {
            documents: HashSet::with_capacity(INITIAL_DOCUMENT_CAPACITY),
            job_sender,
            config,
        }
    }

    pub const fn config(&self) -> &Config {
        &self.config
    }

    pub async fn insert_document(&self, url: String) -> bool {
        self.documents.insert_async(url).await.is_ok()
    }

    pub const fn job_sender(
        &self,
    ) -> &Sender<Box<dyn Future<Output = Result<DocumentOutput, Error>> + Send>> {
        &self.job_sender
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use tokio::sync::mpsc::channel;

    #[tokio::test]
    async fn insert_document() {
        let context = Context::new(
            channel(1).0,
            Config::new(vec![], Default::default(), Default::default()),
        );

        assert!(context.insert_document("https://foo.com/".into()).await);
        assert!(!context.insert_document("https://foo.com/".into()).await);
    }

    #[tokio::test]
    async fn insert_different_documents() {
        let context = Context::new(
            channel(1).0,
            Config::new(vec![], Default::default(), Default::default()),
        );

        assert!(context.insert_document("https://foo.com/".into()).await);
        assert!(context.insert_document("https://foo.com/bar".into()).await);
    }
}