amqp_api_server/api/input/
request.rs1use amqp_api_shared::request_result::RequestResult;
2use amqp_api_shared::request_result_error::{RequestResultError, RequestResultErrorKind};
3use crate::api::input::request_header::RequestHeader;
4use crate::api::input::token::Token;
5use serde::de::DeserializeOwned;
6use serde_json::{Map, Value};
7
8use crate::error::{Error, ErrorKind};
9
10#[derive(Debug)]
11pub struct Request {
12 pub data: Map<String, Value>,
13 pub authorized_token: Option<Token>,
14}
15
16const HEADER_KEY: &str = "header";
17
18impl Request {
19 pub fn new(request: Map<String, Value>) -> Request {
20 Request {
21 data: request,
22 authorized_token: None,
23 }
24 }
25
26 pub fn try_get_token(&self) -> Result<String, Error> {
27 let header = self.try_get_header()?;
28
29 Ok(header.token().to_string())
30 }
31
32 pub fn try_get_header(&self) -> Result<RequestHeader, Error> {
33 let header = match self.data.get(HEADER_KEY) {
34 Some(header) => match serde_json::from_value::<RequestHeader>(header.clone()) {
35 Ok(header) => header,
36 Err(error) => {
37 return Err(Error::new(
38 ErrorKind::MalformedRequest,
39 format!("failed to deserialize request header: {}", error),
40 ));
41 }
42 },
43 None => {
44 return Err(Error::new(
45 ErrorKind::MalformedRequest,
46 "request has no header",
47 ));
48 }
49 };
50
51 Ok(header)
52 }
53
54 pub fn try_get_parameter<T: DeserializeOwned>(&self, key: &str) -> Result<T, Error> {
55 match self.data.get(key) {
56 Some(raw_value) => match serde_json::from_value::<T>(raw_value.clone()) {
57 Ok(value) => Ok(value),
58 Err(error) => Err(Error::new(
59 ErrorKind::MalformedRequest,
60 format!("failed to read '{}': {}", key, error),
61 )),
62 },
63 None => Err(Error::new(
64 ErrorKind::MalformedRequest,
65 format!("request has no '{}'", key),
66 )),
67 }
68 }
69}
70
71pub fn extract_parameter_from_request_data<ParameterType: DeserializeOwned>(
72 request_data: &Map<String, Value>,
73 key: &str,
74) -> Result<ParameterType, RequestResult> {
75 match request_data.get(key) {
76 Some(raw_value) => match serde_json::from_value::<ParameterType>(raw_value.clone()) {
77 Ok(value) => Ok(value),
78 Err(error) => Err(RequestResult::Err(RequestResultError::new(
79 RequestResultErrorKind::BadRequest,
80 format!("failed to read '{}': {}", key, error),
81 ))),
82 },
83 None => Err(RequestResult::Err(RequestResultError::new(
84 RequestResultErrorKind::BadRequest,
85 format!("request has no '{}'", key),
86 ))),
87 }
88}