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()),
}
}
}