argus-dedupe 0.1.0

Content deduplication utilities for web crawling
Documentation
use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::Mutex;

use async_trait::async_trait;

use crate::set_trait::SeenSet;

#[derive(Clone, Default)]
pub struct SeenUrlSet {
    inner: Arc<Mutex<HashSet<String>>>,
}

#[async_trait]
impl SeenSet for SeenUrlSet {
    async fn insert_if_new(&self, url: String) -> bool {
        let mut guard = self.inner.lock().await;
        guard.insert(url)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn insert_if_new_returns_true_for_new_url() {
        let set = SeenUrlSet::default();
        let inserted = set.insert_if_new("https://example.com/".to_string()).await;
        assert!(inserted);
    }

    #[tokio::test]
    async fn insert_if_new_returns_false_for_seen_url() {
        let set = SeenUrlSet::default();
        let url = "https://example.com/page".to_string();
        set.insert_if_new(url.clone()).await;
        let inserted = set.insert_if_new(url).await;
        assert!(!inserted);
    }
}