nodata 0.1.0

nodata is a kafka like message broker that is simple and easy to use, while relying on either local or s3 like data storage for consistency
use crate::state::SharedState;

use super::{
    consumers::{Consumer, Topic, TopicOffset},
    staging::Staging,
};

#[derive(Clone)]
pub struct Handler {
    staging: Staging,
}

impl Handler {
    pub fn new(staging: Staging) -> Self {
        Self { staging }
    }

    pub async fn handle_offset(
        &self,
        topic: &Topic,
        consumer: &Consumer,
        start_offset: TopicOffset,
        end_offset: TopicOffset,
    ) -> anyhow::Result<()> {
        let events = self
            .staging
            .get_topic_offset(topic, start_offset, end_offset)
            .await?;

        // TODO: handle events
        for event in events {
            tracing::trace!("handling event: {:?}", event);
            consumer.tx.send(event).await?;
        }

        Ok(())
    }
}

pub trait HandlerState {
    fn handler(&self) -> Handler;
}

impl HandlerState for SharedState {
    fn handler(&self) -> Handler {
        self.handler.clone()
    }
}