use url::Url; pub struct ThoughtsUrls { pub base_url: String, } impl ThoughtsUrls { pub fn new(base_url: &str) -> Self { Self { base_url: base_url.trim_end_matches('/').to_string(), } } pub fn user_url(&self, username: &str) -> Url { Url::parse(&format!("{}/users/{}", self.base_url, username)).expect("valid URL") } pub fn thought_url(&self, thought_id: uuid::Uuid) -> Url { Url::parse(&format!("{}/thoughts/{}", self.base_url, thought_id)).expect("valid URL") } pub fn user_inbox(&self, username: &str) -> Url { Url::parse(&format!("{}/users/{}/inbox", self.base_url, username)).expect("valid URL") } pub fn user_outbox(&self, username: &str) -> Url { Url::parse(&format!("{}/users/{}/outbox", self.base_url, username)).expect("valid URL") } pub fn user_followers(&self, username: &str) -> Url { Url::parse(&format!("{}/users/{}/followers", self.base_url, username)).expect("valid URL") } } #[cfg(test)] mod tests { use super::*; #[test] fn user_url_format() { let urls = ThoughtsUrls::new("https://example.com"); assert_eq!( urls.user_url("alice").as_str(), "https://example.com/users/alice" ); } #[test] fn thought_url_format() { let urls = ThoughtsUrls::new("https://example.com"); let id = uuid::Uuid::nil(); assert!(urls .thought_url(id) .as_str() .starts_with("https://example.com/thoughts/")); } }