Changeset - 1410a137843e
[Not reviewed]
0 3 0
Christopher Esterhuyse - 5 years ago 2020-02-05 17:26:58
christopheresterhuyse@gmail.com
api
3 files changed with 18 insertions and 23 deletions:
0 comments (0 inline, 0 general)
src/runtime/connector.rs
Show inline comments
 
@@ -26,18 +26,14 @@ impl Connector {
 
        let controller_id = match self {
 
            Connector::Configured(_) => return Err(AlreadyConfigured),
 
            Connector::Connected(_) => return Err(AlreadyConnected),
 
            Connector::Unconfigured(Unconfigured { controller_id }) => *controller_id,
 
        };
 
        let protocol_description = Arc::new(ProtocolD::parse(pdl).map_err(ParseErr)?);
 
        let proto_maybe_bindings = protocol_description
 
            .main_interface_polarities()
 
            .into_iter()
 
            .zip(std::iter::repeat(None))
 
            .collect();
 
        let configured = Configured { controller_id, protocol_description, proto_maybe_bindings };
 
        let configured =
 
            Configured { controller_id, protocol_description, bindings: Default::default() };
 
        *self = Connector::Configured(configured);
 
        Ok(())
 
    }
 

	
 
    /// Bind the (configured) connector's port corresponding to the
 
    pub fn bind_port(
 
@@ -47,33 +43,34 @@ impl Connector {
 
    ) -> Result<(), PortBindErr> {
 
        use PortBindErr::*;
 
        match self {
 
            Connector::Unconfigured { .. } => Err(NotConfigured),
 
            Connector::Connected(_) => Err(AlreadyConnected),
 
            Connector::Configured(configured) => {
 
                match configured.proto_maybe_bindings.get_mut(proto_port_index) {
 
                    None => Err(IndexOutOfBounds),
 
                    Some((_polarity, Some(_))) => Err(PortAlreadyBound),
 
                    Some((_polarity, x @ None)) => {
 
                        *x = Some(binding);
 
                        Ok(())
 
                    }
 
                }
 
                configured.bindings.insert(proto_port_index, binding);
 
                Ok(())
 
            }
 
        }
 
    }
 
    pub fn connect(&mut self, timeout: Duration) -> Result<(), ConnectErr> {
 
        let deadline = Instant::now() + timeout;
 
        use ConnectErr::*;
 
        let configured = match self {
 
            Connector::Unconfigured { .. } => return Err(NotConfigured),
 
            Connector::Connected(_) => return Err(AlreadyConnected),
 
            Connector::Configured(configured) => configured,
 
        };
 
        // 1. Unwrap bindings or err
 
        let bound_proto_interface: Vec<(_, _)> = configured
 
        let mut bindings_vec = Vec::with_capacity(configured.bindings.len());
 
        for native_index in 0..configured.bindings.len() {
 
            let binding =
 
                configured.bindings.get(&native_index).ok_or(PortNotBound { native_index })?;
 
            bindings_vec.push(*binding);
 
        }
 
        let bound_proto_interface: Vec<(_, _)> = (0..num_bindings)
 
            .map(|i| configured.bindings.get())
 
            .proto_maybe_bindings
 
            .iter()
 
            .copied()
 
            .enumerate()
 
            .map(|(native_index, (polarity, maybe_binding))| {
 
                Ok((maybe_binding.ok_or(PortNotBound { native_index })?, polarity))
src/runtime/errors.rs
Show inline comments
 
use crate::common::*;
 

	
 
#[derive(Debug)]
 
pub enum PortBindErr {
 
    AlreadyConnected,
 
    IndexOutOfBounds,
 
    PortAlreadyBound,
 
    NotConfigured,
 
    ParseErr,
 
    AlreadyConfigured,
 
}
 
#[derive(Debug)]
 
pub enum ReadGottenErr {
src/runtime/mod.rs
Show inline comments
 
@@ -46,24 +46,23 @@ pub enum Connector {
 
}
 
#[derive(Debug)]
 
pub struct Unconfigured {
 
    pub controller_id: ControllerId,
 
}
 
#[derive(Debug)]
 
pub struct Configured {
 
    controller_id: ControllerId,
 
    bindings: HashMap<usize, PortBinding>,
 
    protocol_description: Arc<ProtocolD>,
 
}
 
#[derive(Debug)]
 
pub struct Connected {
 
    native_interface: Vec<(Key, Polarity)>,
 
    sync_batches: Vec<SyncBatch>,
 
    controller: Controller,
 
}
 
#[derive(Debug)]
 
pub struct Configured {
 
    // invariant: proto_maybe_bindings.len() is the size of the protocol's interface
 
    controller_id: ControllerId,
 
    proto_maybe_bindings: Vec<(Polarity, Option<PortBinding>)>,
 
    protocol_description: Arc<ProtocolD>,
 
}
 

	
 
#[derive(Debug, Copy, Clone)]
 
pub enum PortBinding {
 
    Native,
 
    Active(SocketAddr),
 
    Passive(SocketAddr),
0 comments (0 inline, 0 general)