graph_http/
request_components.rs1use std::io::ErrorKind;
2
3use graph_core::resource::ResourceIdentity;
4use graph_error::{GraphFailure, GraphResult};
5use http::{HeaderMap, Method};
6use url::Url;
7
8#[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}