use crate::error::*;
use bmp_protocol::{
types::BmpMessage,
BmpDecoder
};
use tokio::{
net::TcpStream,
stream::StreamExt,
};
use tokio_util::codec::FramedRead;
use std::time::{Duration, Instant};
#[derive(Debug)]
pub struct BmpClient {
connected: Instant,
inner: FramedRead<TcpStream, BmpDecoder>,
messages: usize,
}
impl BmpClient {
pub fn new(stream: TcpStream) -> Self {
let inner = FramedRead::new(stream, BmpDecoder::new());
Self {
connected: Instant::now(),
inner,
messages: 0,
}
}
pub async fn recv(&mut self) -> Option<Result<BmpMessage, Error>> {
self.inner.next().await
.and_then(|m| { self.messages += 1; Some(m) })
.map(|thing| thing.map_err(|e| e.into()))
}
pub fn connected(&self) -> Duration {
self.connected.elapsed()
}
pub fn messages(&self) -> usize {
self.messages
}
}