bitbroker 0.0.1-alpha

A language agnostic message broker designed for real-time communication.
Documentation
use std::future::Future;

use crate::{BitBrokerMessage, Connection, Result};

pub trait BaseBot {
    type State<'a>: From<&'a [u8]>;
    type Response: Into<Vec<u8>>;

    const NAME: &'static str;

    fn decide_move<'a>(
        &mut self,
        state: Self::State<'a>,
    ) -> impl Future<Output = Self::Response> + Send;
}

pub async fn run_bot<B>(mut bot: B, host: &str, port: usize) -> Result<()>
where
    B: BaseBot,
{
    let mut connection = Connection::new(host, port).await?;
    connection
        .send_message(BitBrokerMessage::initial_bot_message())
        .await?;

    connection
        .send_message(BitBrokerMessage::bot_info_message(B::NAME))
        .await?;

    loop {
        let message: BitBrokerMessage = connection.read_message().await?;
        match message.codes() {
            (0x00, 0xFF) => return Ok(()),
            (0x02, 0x00) => return Err(message.into()),
            (0x02, _timeout) => {
                let decision = bot.decide_move(message.body().into()).await;
                let response = BitBrokerMessage::new(0x02, 0x00, decision.into());
                connection.send_message(response).await?;
            }
            _ => return Err(message.into()),
        }
    }
}