dfx 1.0.0-beta

A FIX protocol implementation
Documentation
use std::sync::mpsc;
use std::sync::mpsc::{Receiver, Sender};
use std::time::Duration;

pub(crate) trait Responder: Send {
    fn send(&mut self, message: String) -> bool;
    fn disconnect(&mut self);
}

pub(crate) enum ResponderEvent {
    Send(String),
    Disconnect,
}
pub(crate) enum ResponderResponse {
    Sent(bool),
}

pub(crate) struct ChannelResponder {
    tx: Sender<ResponderEvent>,
    rx: Receiver<ResponderResponse>,
}

impl ChannelResponder {
    pub fn new() -> (Self, Receiver<ResponderEvent>, Sender<ResponderResponse>) {
        let (tx, out_rx) = mpsc::channel();
        let (out_tx, rx) = mpsc::channel();
        (ChannelResponder { tx, rx }, out_rx, out_tx)
    }
}

impl Responder for ChannelResponder {
    fn send(&mut self, message: String) -> bool {
        match self.tx.send(ResponderEvent::Send(message)) {
            Ok(_) => match self.rx.recv_timeout(Duration::from_millis(10)) {
                Ok(response) => match response {
                    ResponderResponse::Sent(sent) => sent,
                },
                Err(_e) => false,
            },
            Err(_) => false,
        }
    }

    fn disconnect(&mut self) {
        self.tx.send(ResponderEvent::Disconnect).unwrap()
    }
}