websockets 0.3.0

A WebSocket client implementation.
Documentation
use std::convert::TryFrom;
use std::net::{SocketAddr, ToSocketAddrs};

use url::Url;

use crate::WebSocketError;

#[derive(Debug)]
pub(super) struct ParsedAddr {
    pub scheme: String,
    pub host: String,
    pub path: String,
    pub addr: SocketAddr,
}

impl TryFrom<&str> for ParsedAddr {
    type Error = WebSocketError;

    fn try_from(url: &str) -> Result<Self, Self::Error> {
        let parsed_url = Url::parse(url).map_err(|e| WebSocketError::ParseError(e))?;
        let scheme = parsed_url.scheme();
        let host = parsed_url.host_str().ok_or(WebSocketError::HostError)?;
        let path = parsed_url.path();
        let port = parsed_url
            .port_or_known_default()
            .ok_or(WebSocketError::PortError)?;
        let addr = (host, port)
            .to_socket_addrs()
            .map_err(|e| WebSocketError::SocketAddrError(e))?
            .next()
            .ok_or(WebSocketError::ResolutionError)?;
        Ok(ParsedAddr {
            scheme: scheme.to_string(),
            host: host.to_string(),
            path: path.to_string(),
            addr,
        })
    }
}