@@ -16,29 +16,24 @@ use reqwest::IntoUrl;
1616use reqwest:: StatusCode ;
1717use reqwest:: Url ;
1818
19- #[ derive( Debug , thiserror:: Error ) ]
20- #[ error( "{0}" ) ]
21- pub enum Error {
22- #[ from( std:: io:: Error ) ]
23- IO ( std:: io:: Error ) ,
24- #[ from( reqwest:: Error ) ]
25- Http ( reqwest:: Error ) ,
26-
27- Other ( String ) ,
28- }
19+ use crate :: Error ;
2920
30- pub struct ClientBuilder {
31- endpoint : String ,
21+ #[ derive( Debug , Clone ) ]
22+ pub struct ClientFactory {
23+ client : reqwest:: Client ,
3224}
3325
34- impl ClientBuilder {
35- pub fn new ( endpoint : String ) -> Self {
36- Self { endpoint }
26+ impl ClientFactory {
27+ pub fn new ( ) -> Result < Self , Error > {
28+ let client = reqwest:: ClientBuilder :: new ( )
29+ . no_proxy ( )
30+ . build ( )
31+ . map_err ( Error :: Http ) ?;
32+ Ok ( Self { client } )
3733 }
3834
39- pub fn build ( self ) -> Result < Client , Error > {
40- let builder = reqwest:: ClientBuilder :: new ( ) . no_proxy ( ) ;
41- Client :: new ( self . endpoint , builder)
35+ pub fn make_client ( & self , endpoint : String ) -> Result < Client , Error > {
36+ Client :: new ( endpoint, self . client . clone ( ) )
4237 }
4338}
4439
@@ -60,8 +55,7 @@ impl Client {
6055 do_delete ( self , key) . await
6156 }
6257
63- fn new ( base_url : impl IntoUrl , builder : reqwest:: ClientBuilder ) -> Result < Self , Error > {
64- let client = builder. build ( ) . map_err ( Error :: Http ) ?;
58+ fn new ( base_url : impl IntoUrl , client : reqwest:: Client ) -> Result < Self , Error > {
6559 let base_url = base_url. into_url ( ) . map_err ( Error :: Http ) ?;
6660 Ok ( Client { client, base_url } )
6761 }
@@ -72,14 +66,16 @@ async fn do_get(client: &Client, key: &str) -> Result<Option<Vec<u8>>, Error> {
7266 . base_url
7367 . join ( key)
7468 . map_err ( |e| Error :: Other ( e. to_string ( ) ) ) ?;
69+
7570 let resp = client. client . get ( url) . send ( ) . await . map_err ( Error :: Http ) ?;
7671
7772 match resp. status ( ) {
78- StatusCode :: NOT_FOUND | StatusCode :: TOO_MANY_REQUESTS => Ok ( None ) ,
73+ StatusCode :: NOT_FOUND => Ok ( None ) ,
7974 StatusCode :: OK => {
8075 let body = resp. bytes ( ) . await . map_err ( Error :: Http ) ?;
8176 Ok ( Some ( body. to_vec ( ) ) )
8277 }
78+ StatusCode :: TOO_MANY_REQUESTS => Err ( Error :: TooManyRequests ) ,
8379 _ => Err ( Error :: Other ( resp. status ( ) . to_string ( ) ) ) ,
8480 }
8581}
@@ -89,6 +85,7 @@ async fn do_put(client: &Client, key: &str, value: &[u8]) -> Result<(), Error> {
8985 . base_url
9086 . join ( key)
9187 . map_err ( |e| Error :: Other ( e. to_string ( ) ) ) ?;
88+
9289 let resp = client
9390 . client
9491 . put ( url)
@@ -98,11 +95,9 @@ async fn do_put(client: &Client, key: &str, value: &[u8]) -> Result<(), Error> {
9895 . map_err ( Error :: Http ) ?;
9996
10097 match resp. status ( ) {
101- StatusCode :: OK
102- | StatusCode :: CREATED
103- | StatusCode :: NO_CONTENT
104- | StatusCode :: TOO_MANY_REQUESTS => Ok ( ( ) ) ,
105- _ => Err ( Error :: Other ( resp. status ( ) . to_string ( ) ) ) ,
98+ StatusCode :: OK | StatusCode :: CREATED => Ok ( ( ) ) ,
99+ StatusCode :: TOO_MANY_REQUESTS => Err ( Error :: TooManyRequests ) ,
100+ status => Err ( Error :: Other ( status. to_string ( ) ) ) ,
106101 }
107102}
108103
@@ -111,6 +106,7 @@ async fn do_delete(client: &Client, key: &str) -> Result<(), Error> {
111106 . base_url
112107 . join ( key)
113108 . map_err ( |e| Error :: Other ( e. to_string ( ) ) ) ?;
109+
114110 let resp = client
115111 . client
116112 . delete ( url)
@@ -119,7 +115,8 @@ async fn do_delete(client: &Client, key: &str) -> Result<(), Error> {
119115 . map_err ( Error :: Http ) ?;
120116
121117 match resp. status ( ) {
122- StatusCode :: OK | StatusCode :: NO_CONTENT | StatusCode :: TOO_MANY_REQUESTS => Ok ( ( ) ) ,
123- _ => Err ( Error :: Other ( resp. status ( ) . to_string ( ) ) ) ,
118+ StatusCode :: OK | StatusCode :: NO_CONTENT => Ok ( ( ) ) ,
119+ StatusCode :: TOO_MANY_REQUESTS => Err ( Error :: TooManyRequests ) ,
120+ status => Err ( Error :: Other ( status. to_string ( ) ) ) ,
124121 }
125122}
0 commit comments