pub trait QueryExtractor {
fn extract_value(&self, key: &str) -> Option<&str>;
}
impl<T: AsRef<str>> QueryExtractor for T {
fn extract_value(&self, key: &str) -> Option<&str> {
self.as_ref().split('&').find_map(|pair| {
let mut parts = pair.split('=');
let k = parts.next()?;
let v = parts.next()?;
if k == key { Some(v) } else { None }
})
}
}
#[cfg(test)]
mod tests {
use super::QueryExtractor;
#[test]
fn test_extract_value() {
let query = "key1=val1&key2=val2&key3=val3";
let query_string = String::from(query);
assert_eq!(query.extract_value("key1"), Some("val1"));
assert_eq!(query.extract_value("key2"), Some("val2"));
assert_eq!(query.extract_value("key3"), Some("val3"));
assert_eq!(query.extract_value("key4"), None);
assert_eq!(query_string.extract_value("key1"), Some("val1"));
assert_eq!(query_string.extract_value("key2"), Some("val2"));
assert_eq!(query_string.extract_value("key3"), Some("val3"));
assert_eq!(query_string.extract_value("key4"), None);
}
#[test]
fn test_extract_value_empty() {
let query = "";
let query_string = String::from(query);
assert_eq!(query.extract_value("key1"), None);
assert_eq!(query_string.extract_value("key1"), None);
}
#[test]
fn test_extract_value_no_value() {
let query = "key1=&key2=val2";
let query_string = String::from(query);
assert_eq!(query.extract_value("key1"), Some(""));
assert_eq!(query.extract_value("key2"), Some("val2"));
assert_eq!(query_string.extract_value("key1"), Some(""));
assert_eq!(query_string.extract_value("key2"), Some("val2"));
}
#[test]
fn test_extract_value_multiple_keys() {
let query = "key1=val1&key1=val2&key3=val3";
let query_string = String::from(query);
assert_eq!(query.extract_value("key1"), Some("val1")); assert_eq!(query.extract_value("key3"), Some("val3"));
assert_eq!(query_string.extract_value("key1"), Some("val1")); assert_eq!(query_string.extract_value("key3"), Some("val3"));
}
#[test]
fn test_extract_value_malformed_query() {
let query = "key1=val1&key2&key3=val3";
let query_string = String::from(query);
assert_eq!(query.extract_value("key1"), Some("val1"));
assert_eq!(query.extract_value("key2"), None);
assert_eq!(query.extract_value("key3"), Some("val3"));
assert_eq!(query_string.extract_value("key1"), Some("val1"));
assert_eq!(query_string.extract_value("key2"), None);
assert_eq!(query_string.extract_value("key3"), Some("val3"));
}
}