mai 0.1.0

A higher-level mio interface.
Documentation
use ProtocolEngineBuilder;
use Protocol;

pub trait OptionSetter<T> {
  fn set_option(self, T) -> T;
}

#[derive(Clone,Copy,Debug)]
pub struct Bytes(pub usize);
#[derive(Clone,Copy,Debug)]
pub struct Kilobytes(pub usize);
#[derive(Clone,Copy,Debug)]
pub struct Megabytes(pub usize);

pub trait ToBytes {
  fn to_bytes(&self) -> Bytes;
}

impl ToBytes for Bytes {
  fn to_bytes(&self) -> Bytes {
    *self
  }
}

impl ToBytes for Kilobytes {
  fn to_bytes(&self) -> Bytes {
    let Kilobytes(kb) = *self;
    Bytes(kb * 1_000)
  }
}

impl ToBytes for Megabytes {
  fn to_bytes(&self) -> Bytes {
    let Megabytes(mb) = *self;
    Bytes(mb * 1_000_000)
  }
}

pub struct InitialBufferSize<T>(pub T) where T: ToBytes;
pub struct InitialBufferPoolSize(pub usize);
pub struct MaxBufferPoolSize(pub usize);

impl <P, T> OptionSetter<ProtocolEngineBuilder<P>> for InitialBufferSize<T> where P: Protocol, T: ToBytes {
  fn set_option(self, mut builder: ProtocolEngineBuilder<P>) -> ProtocolEngineBuilder<P> {
    let InitialBufferSize(size) = self;
    let number_of_bytes: Bytes = size.to_bytes();
    builder.starting_buffer_size = number_of_bytes;
    builder
  }
}

impl <P> OptionSetter<ProtocolEngineBuilder<P>> for InitialBufferPoolSize where P: Protocol {
  fn set_option(self, mut builder: ProtocolEngineBuilder<P>) -> ProtocolEngineBuilder<P> {
    let InitialBufferPoolSize(number_of_buffers) = self;
    builder.buffer_pool_size = number_of_buffers;
    builder
  }
}

impl <P> OptionSetter<ProtocolEngineBuilder<P>> for MaxBufferPoolSize where P: Protocol {
  fn set_option(self, mut builder: ProtocolEngineBuilder<P>) -> ProtocolEngineBuilder<P> {
    let MaxBufferPoolSize(number_of_buffers) = self;
    builder.max_buffer_pool_size = number_of_buffers;
    builder
  }
}