Guest User

Untitled

a guest
Mar 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. extern crate serde;
  2. extern crate serde_json;
  3.  
  4. #[macro_use] extern crate serde_derive;
  5.  
  6. use serde::Deserialize;
  7. use std::collections::HashMap;
  8.  
  9. struct Route<P> {
  10. params: P,
  11. }
  12.  
  13. impl<P> Route<P> {
  14. fn new(path_pattern: &str, request_path: &str) -> Route<P> where for<'a> P: Deserialize<'a> {
  15. let pattern_map: HashMap<String, String> = path_pattern.split('/').zip(
  16. request_path.split('/')
  17. ).filter_map(
  18. |(pattern, path_component)| {
  19. let is_param = pattern.chars().nth(0)
  20. .map(|c| c == ':')
  21. .unwrap_or(false);
  22. if is_param {
  23. let param_no_colon: String = pattern.chars().enumerate()
  24. .filter_map(|(i, c)| if i == 0 { None } else { Some(c) }).collect();
  25. Some((param_no_colon, path_component.to_string()))
  26. } else {
  27. None
  28. }
  29. }
  30. ).collect();
  31.  
  32. let params: P = serde_json::from_value(serde_json::to_value(pattern_map).unwrap()).unwrap();
  33.  
  34. Route{params: params}
  35. }
  36. }
  37.  
  38. #[cfg(test)]
  39. mod tests {
  40. use super::Route;
  41. use serde::Deserialize;
  42. use std::collections::HashMap;
  43.  
  44. #[derive(Deserialize, Debug, PartialEq)]
  45. struct Foo{
  46. bar: String,
  47. }
  48.  
  49. #[test]
  50. fn it_works() {
  51. let route: Route<Foo> = Route::new("/foo/:bar", "/foo/baz");
  52. let expected_params = Foo{bar: "baz".to_string()};
  53. assert_eq!(route.params, expected_params);
  54. }
  55. }
Add Comment
Please, Sign In to add comment