app_forge_kit_http_client/
lib.rs1#[cfg(feature = "default")]
3mod config;
4#[cfg(feature = "default")]
5mod provider;
6
7pub 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#[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::*;