1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use crate::Query; use hyper::Request; use std::collections::HashMap; /// An extension trait which extends the [`hyper::Request`](https://docs.rs/hyper/0.13.5/hyper/struct.Request.html) type with some helpful methods to /// access query values from `req` object. pub trait RequestQueryExt { /// It returns the parsed queries in a [HashMap](https://doc.rust-lang.org/std/collections/struct.HashMap.html). /// /// # Examples /// /// ``` /// use hyper::{Body, Request, Response, Server}; /// use routerify::{Router, RouterService}; /// // Import the query_parser function and the RequestQueryExt trait. /// use routerify_query::{query_parser, RequestQueryExt}; /// use std::{convert::Infallible, net::SocketAddr}; /// /// // A handler for "/" page. Visit: "/?username=Alice&bookname=HarryPotter" to see query values. /// async fn home_handler(req: Request<Body>) -> Result<Response<Body>, Infallible> { /// // Access the query values. /// let queries = req.queries(); /// /// let user_name = queries.get("username").unwrap(); /// let book_name = queries.get("bookname").unwrap(); /// /// Ok(Response::new(Body::from(format!( /// "User: {}, Book: {}", /// user_name, book_name /// )))) /// } /// /// # fn run() -> Router<Body, Infallible> { /// // Create a router. /// Router::builder() /// // Attach the query_parser middleware. /// .middleware(query_parser()) /// .get("/", home_handler) /// .build() /// .unwrap() /// } /// # run(); /// ``` fn queries(&self) -> &HashMap<String, String>; /// It returns the query value by a query name. /// /// # Examples /// /// ``` /// use hyper::{Body, Request, Response, Server}; /// use routerify::{Router, RouterService}; /// // Import the query_parser function and the RequestQueryExt trait. /// use routerify_query::{query_parser, RequestQueryExt}; /// use std::{convert::Infallible, net::SocketAddr}; /// /// // A handler for "/" page. Visit: "/?username=Alice&bookname=HarryPotter" to see query values. /// async fn home_handler(req: Request<Body>) -> Result<Response<Body>, Infallible> { /// // Access the query values. /// let user_name = req.query("username").unwrap(); /// let book_name = req.query("bookname").unwrap(); /// /// Ok(Response::new(Body::from(format!( /// "User: {}, Book: {}", /// user_name, book_name /// )))) /// } /// /// # fn run() -> Router<Body, Infallible> { /// // Create a router. /// Router::builder() /// // Attach the query_parser middleware. /// .middleware(query_parser()) /// .get("/", home_handler) /// .build() /// .unwrap() /// } /// # run(); /// ``` fn query<P: Into<String>>(&self, query_name: P) -> Option<&String>; } impl RequestQueryExt for Request<hyper::Body> { fn queries(&self) -> &HashMap<String, String> { self.extensions() .get::<Query>() .map(|q| &q.0) .expect("Routerify-Query: No parsed queries added to the request object while processing request. Make sure the `query_parser` middleware is attached properly.") } fn query<P: Into<String>>(&self, query_name: P) -> Option<&String> { self.queries().get(&query_name.into()) } }