reep_optionparser_urlencoded/
lib.rs

1#![deny(missing_docs)]
2
3//! A default implementation for the reep::types::OptionParser
4//! witch uses the urlencoded QueryParser parsing queries into
5//! a QueryMap (a `HashMap<String, Vec<String>>`)
6
7
8extern crate iron;
9extern crate reep;
10extern crate urlencoded;
11
12use iron::prelude::*;
13use iron::typemap::Key;
14use iron::status;
15use reep::types::{ParserMiddleware, OptionParser};
16use urlencoded::{QueryMap, UrlEncodedQuery, UrlDecodingError};
17
18/// a default implementation, using the urlencoded cargo package to parse options
19/// (into a HashMap<String, Vec<String>>)
20pub struct DefaultOptionParser;
21
22impl Key for DefaultOptionParser {
23    type Value = QueryMap;
24}
25
26impl ParserMiddleware for DefaultOptionParser {
27    fn parse(&self, req: &mut Request) -> IronResult<Self::Value> {
28        match req.compute::<UrlEncodedQuery>() {
29            Ok(data) => Ok(data),
30            Err(UrlDecodingError::EmptyQuery) => Ok(QueryMap::new()),
31            Err(decoding_error) =>  {
32                Err(IronError::new(decoding_error, (status::BadRequest)))
33            }
34        }
35    }
36}
37
38impl OptionParser for DefaultOptionParser {}