chorus/src/lib.rs

94 lines
2.6 KiB
Rust
Raw Normal View History

2023-06-19 10:27:32 +02:00
#![allow(clippy::module_inception)]
use url::{ParseError, Url};
#[cfg(feature = "client")]
pub mod api;
pub mod errors;
#[cfg(feature = "client")]
pub mod gateway;
#[cfg(feature = "client")]
pub mod instance;
#[cfg(feature = "client")]
pub mod limit;
2023-05-25 21:11:08 +02:00
pub mod types;
#[cfg(feature = "client")]
pub mod voice;
2023-04-05 21:54:27 +02:00
2023-04-16 22:16:39 +02:00
#[derive(Clone, Default, Debug, PartialEq, Eq)]
2023-04-05 21:54:27 +02:00
/// 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");
/// ```
/// `-> Outputs "http://localhost:3000".`
pub fn parse_url(url: String) -> String {
let url = match Url::parse(&url) {
Ok(url) => {
if url.scheme() == "localhost" {
return URLBundle::parse_url(format!("http://{}", url));
2023-04-05 21:54:27 +02:00
}
url
}
Err(ParseError::RelativeUrlWithoutBase) => {
let url_fmt = format!("http://{}", url);
return URLBundle::parse_url(url_fmt);
2023-04-05 21:54:27 +02:00
}
Err(_) => panic!("Invalid URL"),
};
// if the last character of the string is a slash, remove it.
let mut url_string = url.to_string();
2023-04-25 17:41:14 +02:00
if url_string.ends_with('/') {
url_string.pop();
}
2023-04-25 17:41:14 +02:00
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 lib {
2023-04-04 17:37:11 +02:00
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/"));
2023-04-05 21:54:27 +02:00
assert_eq!(result, String::from("http://localhost:3000"));
result = URLBundle::parse_url(String::from("https://some.url.com/"));
assert_eq!(result, String::from("https://some.url.com"));
result = URLBundle::parse_url(String::from("https://some.url.com/"));
assert_eq!(result, String::from("https://some.url.com"));
result = URLBundle::parse_url(String::from("https://some.url.com"));
assert_eq!(result, String::from("https://some.url.com"));
2023-04-04 17:37:11 +02:00
}
}