use lambda_http::{http::Method, RequestExt, RequestPayloadExt};
use serde::de::DeserializeOwned;
use super::error::Error;
pub fn try_route<T: DeserializeOwned>(
event: &lambda_http::Request,
method: lambda_http::http::Method,
route: &str,
inbound: Option<&str>,
) -> Result<T, Error> {
if inbound.map(|el| el != route).unwrap_or_default() {
return Err(Error::NotFound);
}
if event.method() != method {
return Err(Error::MethodNotAllowed);
}
match event.method() {
&Method::GET | &Method::DELETE => {
let qs = event.query_string_parameters().to_query_string();
Ok(serde_urlencoded::from_str(&qs)?)
}
_ => match event.payload() {
Ok(Some(payload)) => Ok(payload),
Ok(None) => Err(Error::NoPayload),
Err(err) => Err(Error::Payload(err)),
},
}
}