chorus/src/lib.rs

82 lines
2.1 KiB
Rust
Raw Normal View History

2023-04-10 14:18:33 +02:00
mod api;
2023-04-05 21:54:27 +02:00
mod client;
mod gateway;
mod limit;
mod voice;
use url::{ParseError, Url};
#[derive(Clone, Default)]
/// A URLBundle is a struct which bundles together the API-, Gateway- and CDN-URLs of a Spacebar
/// instance.
pub struct URLBundle {
pub api: String,
pub wss: String,
pub cdn: String,
}
impl URLBundle {
pub fn new(api: String, wss: String, cdn: String) -> Self {
Self {
api: URLBundle::parse_url(api),
wss: URLBundle::parse_url(wss),
cdn: URLBundle::parse_url(cdn),
}
}
/// parse(url: String) parses a URL using the Url library and formats it in a standardized
/// way. If no protocol is given, HTTP (not HTTPS) is assumed.
/// # Example:
/// ```rs
2023-04-05 21:54:27 +02:00
/// let url = parse_url("localhost:3000");
/// println!("{}", url);
/// ```
/// `-> Outputs "http://localhost:3000".`
pub fn parse_url(url: String) -> String {
let url = match Url::parse(&url) {
Ok(url) => {
if url.scheme() == "localhost" {
return format!("http://{}", url);
}
url
}
Err(ParseError::RelativeUrlWithoutBase) => {
let url = format!("http://{}", url);
Url::parse(&url).unwrap()
}
Err(_) => panic!("Invalid URL"),
};
// if the last character of the string is a slash, remove it.
let mut url_string = url.to_string();
if url_string.chars().last().unwrap() == '/' {
url_string.pop();
}
return url_string;
2023-04-05 21:54:27 +02:00
}
pub fn get_api(&self) -> &str {
&self.api
}
pub fn get_cdn(&self) -> &str {
&self.cdn
}
pub fn get_wss(&self) -> &str {
&self.wss
}
2023-04-04 17:37:11 +02:00
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
2023-04-05 21:54:27 +02:00
fn test_parse_url() {
let mut result = URLBundle::parse_url(String::from("localhost:3000"));
assert_eq!(result, String::from("http://localhost:3000"));
result = URLBundle::parse_url(String::from("some.url.com/"));
assert_eq!(result, String::from("http://some.url.com"))
2023-04-04 17:37:11 +02:00
}
}