1use crate::error::*;
2
3use bmp_protocol::{
4 types::BmpMessage,
5 BmpDecoder
6};
7
8use tokio::{
9 net::TcpStream,
10 stream::StreamExt,
11};
12use tokio_util::codec::FramedRead;
13
14use std::time::{Duration, Instant};
15
16#[derive(Debug)]
25pub struct BmpClient {
26 connected: Instant,
27 inner: FramedRead<TcpStream, BmpDecoder>,
28 messages: usize,
29}
30
31impl BmpClient {
32 pub fn new(stream: TcpStream) -> Self {
34 let inner = FramedRead::new(stream, BmpDecoder::new());
35
36 Self {
37 connected: Instant::now(),
38 inner,
39 messages: 0,
40 }
41 }
42
43 pub async fn recv(&mut self) -> Option<Result<BmpMessage, Error>> {
47 self.inner.next().await
48 .and_then(|m| { self.messages += 1; Some(m) })
49 .map(|thing| thing.map_err(|e| e.into()))
50 }
51
52 pub fn connected(&self) -> Duration {
54 self.connected.elapsed()
55 }
56
57 pub fn messages(&self) -> usize {
59 self.messages
60 }
61}