use std;
use std::fmt::Display;
use std::str::FromStr;
use hyper::Uri;
use hyper::error::UriError;
use simplist::HttpError;
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
pub struct Url {
underlying: Uri,
}
impl Url {
pub fn path(&self) -> &str {
self.underlying.path()
}
pub fn scheme(&self) -> Option<&str> {
self.underlying.scheme()
}
pub fn authority(&self) -> Option<&str> {
self.underlying.authority()
}
pub fn host(&self) -> Option<&str> {
self.underlying.host()
}
pub fn port(&self) -> Option<u16> {
self.underlying.port()
}
pub fn query(&self) -> Option<&str> {
self.underlying.query()
}
pub fn is_absolute(&self) -> bool {
self.underlying.is_absolute()
}
}
impl FromStr for Url {
type Err = UriError;
fn from_str(string: &str) -> Result<Url, UriError> {
Ok(Url { underlying: string.parse()? })
}
}
impl Display for Url {
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
self.underlying.fmt(formatter)
}
}
impl Into<Uri> for Url {
fn into(self) -> Uri {
self.underlying
}
}
pub trait IntoUrl {
fn as_url(self) -> Result<Url, HttpError>;
}
impl IntoUrl for String {
fn as_url(self) -> Result<Url, HttpError> {
let v = self.parse()?;
Ok(v)
}
}
impl<'a> IntoUrl for &'a str {
fn as_url(self) -> Result<Url, HttpError> {
let v = self.parse()?;
Ok(v)
}
}
impl IntoUrl for Url {
fn as_url(self) -> Result<Url, HttpError> {
Ok(self)
}
}