cooplan_amqp_api/api/input/
request.rs1use 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}