cooplan_amqp_api/api/input/
request.rs

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