41 lines
1019 B
Rust
41 lines
1019 B
Rust
#[derive(Debug)]
|
|
pub struct Url<'a> {
|
|
path: &'a str,
|
|
query: Option<&'a str>,
|
|
}
|
|
|
|
pub type QueryParam<'a> = (&'a str, &'a str);
|
|
|
|
pub type QueryParams<'a> = Vec<QueryParam<'a>>;
|
|
|
|
impl Url<'_> {
|
|
pub fn parse(url: &str) -> Url {
|
|
let mut parts = url.splitn(2, '?');
|
|
|
|
let path = parts.next().unwrap_or_default().trim_matches('/');
|
|
let query = parts.next();
|
|
|
|
Url { path, query }
|
|
}
|
|
|
|
pub fn path_segments(&self) -> Vec<&str> {
|
|
self.path.split('/').collect()
|
|
}
|
|
|
|
pub fn query_params(&self) -> Vec<QueryParam> {
|
|
self.query
|
|
.map(|q| {
|
|
q.split('&')
|
|
.filter_map(|part| {
|
|
if let [key, val] = part.splitn(2, '=').collect::<Vec<&str>>()[..] {
|
|
Some((key, val))
|
|
} else {
|
|
None
|
|
}
|
|
})
|
|
.collect()
|
|
})
|
|
.unwrap_or_default()
|
|
}
|
|
}
|