use std::fmt::{self, Show, Formatter};
use super::Url;
pub struct PathFormatter<'a, T:'a> {
pub path: &'a [T]
}
impl<'a, T: Str + Show> Show for PathFormatter<'a, T> {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
if self.path.is_empty() {
formatter.write_str("/")
} else {
for path_part in self.path.iter() {
try!("/".fmt(formatter));
try!(path_part.fmt(formatter));
}
Ok(())
}
}
}
pub struct UserInfoFormatter<'a> {
pub username: &'a str,
pub password: Option<&'a str>
}
impl<'a> Show for UserInfoFormatter<'a> {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
if !self.username.is_empty() || self.password.is_some() {
try!(formatter.write_str(self.username));
match self.password {
None => (),
Some(password) => {
try!(formatter.write_str(":"));
try!(formatter.write_str(password));
}
}
try!(formatter.write_str("@"));
}
Ok(())
}
}
pub struct UrlNoFragmentFormatter<'a> {
pub url: &'a Url
}
impl<'a> Show for UrlNoFragmentFormatter<'a> {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
try!(formatter.write_str(self.url.scheme.as_slice()));
try!(formatter.write_str(":"));
try!(self.url.scheme_data.fmt(formatter));
match self.url.query {
None => (),
Some(ref query) => {
try!(formatter.write_str("?"));
try!(formatter.write_str(query.as_slice()));
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::super::Url;
use super::{PathFormatter, UserInfoFormatter};
#[test]
fn path_formatting() {
let data = [
(vec![], "/"),
(vec![""], "/"),
(vec!["test", "path"], "/test/path"),
(vec!["test", "path", ""], "/test/path/")
];
for &(ref path, result) in data.iter() {
assert_eq!(PathFormatter {
path: path.as_slice()
}.to_string(), result.to_string());
}
}
#[test]
fn userinfo_formatting() {
let data = [
("", None, ""),
("", Some(""), ":@"),
("", Some("password"), ":password@"),
("username", None, "username@"),
("username", Some(""), "username:@"),
("username", Some("password"), "username:password@")
];
for &(username, password, result) in data.iter() {
assert_eq!(UserInfoFormatter {
username: username,
password: password
}.to_string(), result.to_string());
}
}
#[test]
fn relative_scheme_url_formatting() {
let data = [
("http://example.com/", "http://example.com/"),
("http://addslash.com", "http://addslash.com/"),
("http://@emptyuser.com/", "http://emptyuser.com/"),
("http://:@emptypass.com/", "http://:@emptypass.com/"),
("http://user@user.com/", "http://user@user.com/"),
("http://user:pass@userpass.com/", "http://user:pass@userpass.com/"),
("http://slashquery.com/path/?q=something", "http://slashquery.com/path/?q=something"),
("http://noslashquery.com/path?q=something", "http://noslashquery.com/path?q=something")
];
for &(input, result) in data.iter() {
let url = Url::parse(input).unwrap();
assert_eq!(url.to_string(), result.to_string());
}
}
}