graph_http/
request_components.rs

1use std::io::ErrorKind;
2
3use graph_core::resource::ResourceIdentity;
4use graph_error::{GraphFailure, GraphResult};
5use http::{HeaderMap, Method};
6use url::Url;
7
8/// Provides the necessary components for building a request.
9#[derive(Clone, Debug)]
10pub struct RequestComponents {
11    pub resource_identity: ResourceIdentity,
12    pub url: Url,
13    pub method: Method,
14    pub headers: HeaderMap,
15}
16
17impl AsRef<Url> for RequestComponents {
18    fn as_ref(&self) -> &Url {
19        &self.url
20    }
21}
22
23impl AsMut<Url> for RequestComponents {
24    fn as_mut(&mut self) -> &mut Url {
25        &mut self.url
26    }
27}
28
29impl AsMut<HeaderMap> for RequestComponents {
30    fn as_mut(&mut self) -> &mut HeaderMap {
31        &mut self.headers
32    }
33}
34
35impl RequestComponents {
36    pub fn new(resource_identity: ResourceIdentity, url: Url, method: Method) -> RequestComponents {
37        RequestComponents {
38            resource_identity,
39            url,
40            method,
41            headers: HeaderMap::with_capacity(2),
42        }
43    }
44
45    pub fn query<T: serde::Serialize + ?Sized>(&mut self, query: &T) -> GraphResult<()> {
46        let mut pairs = self.url.query_pairs_mut();
47        let serializer = serde_urlencoded::Serializer::new(&mut pairs);
48
49        if query.serialize(serializer).is_err() {
50            return Err(GraphFailure::from(std::io::Error::new(
51                ErrorKind::InvalidData,
52                "Unable to serialize query",
53            )));
54        }
55
56        Ok(())
57    }
58}
59
60impl TryFrom<(ResourceIdentity, reqwest::Method, GraphResult<Url>)> for RequestComponents {
61    type Error = GraphFailure;
62
63    fn try_from(value: (ResourceIdentity, Method, GraphResult<Url>)) -> Result<Self, Self::Error> {
64        Ok(RequestComponents::new(value.0, value.2?, value.1))
65    }
66}
67
68impl Default for RequestComponents {
69    fn default() -> Self {
70        RequestComponents {
71            resource_identity: Default::default(),
72            url: Url::parse("https://graph.microsoft.com/v1.0").unwrap(),
73            method: Default::default(),
74            headers: Default::default(),
75        }
76    }
77}