Skip to main content

app_forge_kit_http_client/
lib.rs

1// Internal modules
2#[cfg(feature = "default")]
3mod config;
4#[cfg(feature = "default")]
5mod provider;
6
7// Definition
8pub mod types {
9    pub use reqwest::{IntoUrl, Method, Request, RequestBuilder, Response};
10
11    pub use http::Uri;
12}
13
14#[derive(thiserror::Error, Debug)]
15pub enum Error {
16    #[error(transparent)]
17    InvalidUri(#[from] http::uri::InvalidUri),
18    #[error(transparent)]
19    ReqwestError(#[from] reqwest::Error),
20    #[error(transparent)]
21    InvalidHeaderValue(#[from] http::header::InvalidHeaderValue),
22    #[error(transparent)]
23    UrlParseError(#[from] url::ParseError),
24}
25
26macro_rules! http_methods {
27    ($(($name:ident, $method:ident)),* $(,)?) => {
28        pub trait RequestBuilderProvider {
29            fn request(
30                &self,
31                method: types::Method,
32                uri: &types::Uri,
33            ) -> Result<types::RequestBuilder, Error>;
34
35            $(
36                fn $name(
37                    &self,
38                    uri: &types::Uri,
39                ) -> Result<types::RequestBuilder, Error> {
40                    self.request(types::Method::$method, uri)
41                }
42            )*
43        }
44    };
45}
46
47http_methods!(
48    (get, GET),
49    (post, POST),
50    (put, PUT),
51    (patch, PATCH),
52    (delete, DELETE),
53    (head, HEAD),
54    (options, OPTIONS),
55    (connect, CONNECT),
56    (trace, TRACE),
57);
58
59// Implementation
60#[cfg(feature = "default")]
61mod default {
62    use crate::Error;
63    use crate::RequestBuilderProvider;
64    use std::collections::HashMap;
65    use std::sync::Arc;
66
67    pub use crate::config::Config;
68    pub use crate::provider::Provider;
69
70    pub trait RequestBuilderFromConfig {
71        type Provider;
72        fn request_builder_from_config(self) -> Result<Self::Provider, Error>;
73    }
74
75    impl RequestBuilderFromConfig for Config {
76        type Provider = Arc<dyn RequestBuilderProvider + Send + Sync>;
77
78        fn request_builder_from_config(self) -> Result<Self::Provider, Error> {
79            Ok(Arc::new(Provider::new(&self)?))
80        }
81    }
82
83    impl RequestBuilderFromConfig for HashMap<String, Config> {
84        type Provider = HashMap<String, Arc<dyn RequestBuilderProvider + Send + Sync>>;
85        fn request_builder_from_config(self) -> Result<Self::Provider, Error> {
86            self.into_iter()
87                .map(|(key, config)| Ok((key, config.request_builder_from_config()?)))
88                .collect()
89        }
90    }
91}
92
93#[cfg(feature = "default")]
94pub use default::*;