amqp_api_server/api/input/
request.rs

1use 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}