bgustcrawler 0.2.0

Distributed web crawler and scheduler integrated with Kafka, SurrealDB, and S3 storage
Documentation
use rdkafka::consumer::{Consumer as KafkaConsumer, StreamConsumer};
use rdkafka::config::ClientConfig;
use rdkafka::message::Message;
use anyhow::Result;

pub struct Consumer {
    consumer: StreamConsumer,
}

impl Consumer {
    pub fn new(brokers: &str, group_id: &str, topics: &[&str]) -> Self {
        let consumer: StreamConsumer = ClientConfig::new()
            .set("group.id", group_id)
            .set("bootstrap.servers", brokers)
            .set("enable.partition.eof", "false")
            .set("session.timeout.ms", "6000")
            .set("enable.auto.commit", "true")
            .create()
            .expect("Consumer creation failed");

        consumer.subscribe(topics).expect("Can cant subscribe to specified topics");
        Self { consumer }
    }

    pub async fn listen<F, Fut>(&self, callback: F) -> Result<()> 
    where 
        F: Fn(String) -> Fut,
        Fut: std::future::Future<Output = ()>,
    {
        loop {
            match self.consumer.recv().await {
                Err(e) => eprintln!("Kafka error: {}", e),
                Ok(m) => {
                    if let Some(payload) = m.payload_view::<str>() {
                        match payload {
                            Ok(s) => callback(s.to_string()).await,
                            Err(e) => eprintln!("Error decoding message payload: {}", e),
                        }
                    }
                }
            }
        }
    }
}