use {Uri, Result};
use convert::{HttpTryFrom, HttpTryInto};
use super::{Authority, Scheme, Parts, PathAndQuery};
#[derive(Debug)]
pub struct Builder {
parts: Option<Result<Parts>>,
}
impl Builder {
#[inline]
pub fn new() -> Builder {
Builder::default()
}
pub fn scheme<T>(&mut self, scheme: T) -> &mut Self
where
Scheme: HttpTryFrom<T>,
{
self.map(|parts| {
parts.scheme = Some(scheme.http_try_into()?);
Ok(())
})
}
pub fn authority<T>(&mut self, auth: T) -> &mut Self
where
Authority: HttpTryFrom<T>,
{
self.map(|parts| {
parts.authority = Some(auth.http_try_into()?);
Ok(())
})
}
pub fn path_and_query<T>(&mut self, p_and_q: T) -> &mut Self
where
PathAndQuery: HttpTryFrom<T>,
{
self.map(|parts| {
parts.path_and_query = Some(p_and_q.http_try_into()?);
Ok(())
})
}
pub fn build(&mut self) -> Result<Uri> {
self
.parts
.take()
.expect("cannot reuse Uri builder")
.and_then(|parts| parts.http_try_into())
}
fn map<F>(&mut self, f: F) -> &mut Self
where
F: FnOnce(&mut Parts) -> Result<()>,
{
let res = if let Some(Ok(ref mut parts)) = self.parts {
f(parts)
} else {
return self;
};
if let Err(err) = res {
self.parts = Some(Err(err));
}
self
}
}
impl Default for Builder {
#[inline]
fn default() -> Builder {
Builder {
parts: Some(Ok(Parts::default())),
}
}
}