tube 0.0.2

This crate was renamed to 'tubez'. Please use that crate instead.
Documentation
use std::collections::HashMap;

use crate::tube;
use super::channel;

pub enum ServerMakeTubeError {
    ChannelConnectError(channel::ChannelConnectError),
    MakeTubeError(channel::MakeTubeError),
}

pub struct Client {
  hyper_client: hyper::Client<hyper::client::HttpConnector>,
  implicit_channel: Option<channel::Channel>,
  server_uri: hyper::Uri,
}
impl Client {
  pub fn new(server_uri: hyper::Uri) -> Self {
    let hyper_client: hyper::Client<hyper::client::HttpConnector> = 
      hyper::Client::builder()
        .http2_only(true)
        .build_http();

    Client {
      hyper_client,
      implicit_channel: None,
      server_uri,
    }
  }

  pub async fn make_tube_channel(
    &mut self,
    headers: HashMap<String, String>,
  ) -> Result<channel::Channel, channel::ChannelConnectError> {
    channel::Channel::new(&self.hyper_client, headers, &self.server_uri).await
  }

  pub async fn new_tube(
      &mut self,
      headers: HashMap<String, String>,
  ) -> Result<tube::Tube, ServerMakeTubeError> {
      let channel = match self.implicit_channel.as_mut() {
          Some(channel) => channel,
          None => match self.make_tube_channel(HashMap::new()).await {
              Ok(channel) => {
                  self.implicit_channel = Some(channel);
                  self.implicit_channel.as_mut().unwrap()
              },
              Err(e) => return Err(ServerMakeTubeError::ChannelConnectError(e)),
          },
      };

      match channel.make_tube(headers).await {
          Ok(tube) => Ok(tube),
          Err(e) => Err(ServerMakeTubeError::MakeTubeError(e)),
      }
  }
}

#[cfg(test)]
mod client_tests {
    // TODO
}