recipes/api/src/rest/types.rs

41 lines
1009 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();
let query = parts.next();
Url { path, query }
}
pub fn path_segments(&self) -> Vec<&str> {
self.path.split('/').skip(1).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()
}
}