@@ -3,7 +3,8 @@ use reqwest::{
3
3
Client , Error , Method , Response ,
4
4
} ;
5
5
6
- pub struct Builder {
6
+ /// QueryBuilder struct
7
+ pub struct Builder < ' a > {
7
8
method : Method ,
8
9
url : String ,
9
10
schema : Option < String > ,
@@ -12,12 +13,15 @@ pub struct Builder {
12
13
headers : HeaderMap ,
13
14
body : Option < String > ,
14
15
is_rpc : bool ,
16
+ // sharing a client is a good idea, performance wise
17
+ // the client has to live at least as much as the builder
18
+ client : & ' a Client ,
15
19
}
16
20
17
21
// TODO: Test Unicode support
18
- impl Builder {
22
+ impl < ' a > Builder < ' a > {
19
23
/// Creates a new `Builder` with the specified `schema`.
20
- pub fn new < T > ( url : T , schema : Option < String > , headers : HeaderMap ) -> Self
24
+ pub fn new < T > ( url : T , schema : Option < String > , headers : HeaderMap , client : & ' a Client ) -> Self
21
25
where
22
26
T : Into < String > ,
23
27
{
@@ -29,6 +33,7 @@ impl Builder {
29
33
headers,
30
34
body : None ,
31
35
is_rpc : false ,
36
+ client,
32
37
} ;
33
38
builder
34
39
. headers
@@ -421,26 +426,31 @@ impl Builder {
421
426
422
427
/// Executes the PostgREST request.
423
428
pub async fn execute ( mut self ) -> Result < Response , Error > {
424
- let mut req = Client :: new ( ) . request ( self . method . clone ( ) , & self . url ) ;
425
- if let Some ( schema) = self . schema {
426
- let key = if self . method == Method :: GET || self . method == Method :: HEAD {
427
- "Accept-Profile"
428
- } else {
429
- "Content-Profile"
430
- } ;
431
- self . headers
432
- . insert ( key, HeaderValue :: from_str ( & schema) . unwrap ( ) ) ;
433
- }
434
- if self . method != Method :: GET && self . method != Method :: HEAD {
435
- self . headers
436
- . insert ( "Content-Type" , HeaderValue :: from_static ( "application/json" ) ) ;
437
- }
438
- req = req. headers ( self . headers ) . query ( & self . queries ) ;
439
- if let Some ( body) = self . body {
440
- req = req. body ( body) ;
441
- }
442
-
443
- req. send ( ) . await
429
+ match self . schema {
430
+ Some ( schema) => {
431
+ let key = match self . method {
432
+ Method :: GET | Method :: HEAD => "Accept-Profile" ,
433
+ _ => "Content-Profile" ,
434
+ } ;
435
+ self . headers
436
+ . insert ( key, HeaderValue :: from_str ( & schema) . unwrap ( ) ) ;
437
+ }
438
+ None => { }
439
+ } ;
440
+ match self . method {
441
+ Method :: GET | Method :: HEAD => { }
442
+ _ => {
443
+ self . headers
444
+ . insert ( "Content-Type" , HeaderValue :: from_static ( "application/json" ) ) ;
445
+ }
446
+ } ;
447
+ self . client
448
+ . request ( self . method , self . url )
449
+ . headers ( self . headers )
450
+ . query ( & self . queries )
451
+ . body ( self . body . unwrap_or ( "" . to_string ( ) ) )
452
+ . send ( )
453
+ . await
444
454
}
445
455
}
446
456
@@ -453,7 +463,8 @@ mod tests {
453
463
454
464
#[ test]
455
465
fn only_accept_json ( ) {
456
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) ;
466
+ let client = Client :: new ( ) ;
467
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) ;
457
468
assert_eq ! (
458
469
builder. headers. get( "Accept" ) . unwrap( ) ,
459
470
HeaderValue :: from_static( "application/json" )
@@ -462,7 +473,8 @@ mod tests {
462
473
463
474
#[ test]
464
475
fn auth_with_token ( ) {
465
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . auth ( "$Up3rS3crET" ) ;
476
+ let client = Client :: new ( ) ;
477
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . auth ( "$Up3rS3crET" ) ;
466
478
assert_eq ! (
467
479
builder. headers. get( "Authorization" ) . unwrap( ) ,
468
480
HeaderValue :: from_static( "Bearer $Up3rS3crET" )
@@ -471,7 +483,8 @@ mod tests {
471
483
472
484
#[ test]
473
485
fn select_assert_query ( ) {
474
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . select ( "some_table" ) ;
486
+ let client = Client :: new ( ) ;
487
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . select ( "some_table" ) ;
475
488
assert_eq ! ( builder. method, Method :: GET ) ;
476
489
assert_eq ! (
477
490
builder
@@ -483,7 +496,8 @@ mod tests {
483
496
484
497
#[ test]
485
498
fn order_assert_query ( ) {
486
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . order ( "id" ) ;
499
+ let client = Client :: new ( ) ;
500
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . order ( "id" ) ;
487
501
assert_eq ! (
488
502
builder
489
503
. queries
@@ -494,7 +508,8 @@ mod tests {
494
508
495
509
#[ test]
496
510
fn limit_assert_range_header ( ) {
497
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . limit ( 20 ) ;
511
+ let client = Client :: new ( ) ;
512
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . limit ( 20 ) ;
498
513
assert_eq ! (
499
514
builder. headers. get( "Range" ) . unwrap( ) ,
500
515
HeaderValue :: from_static( "0-19" )
@@ -503,7 +518,8 @@ mod tests {
503
518
504
519
#[ test]
505
520
fn range_assert_range_header ( ) {
506
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . range ( 10 , 20 ) ;
521
+ let client = Client :: new ( ) ;
522
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . range ( 10 , 20 ) ;
507
523
assert_eq ! (
508
524
builder. headers. get( "Range" ) . unwrap( ) ,
509
525
HeaderValue :: from_static( "10-20" )
@@ -512,7 +528,8 @@ mod tests {
512
528
513
529
#[ test]
514
530
fn single_assert_accept_header ( ) {
515
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . single ( ) ;
531
+ let client = Client :: new ( ) ;
532
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . single ( ) ;
516
533
assert_eq ! (
517
534
builder. headers. get( "Accept" ) . unwrap( ) ,
518
535
HeaderValue :: from_static( "application/vnd.pgrst.object+json" )
@@ -521,7 +538,8 @@ mod tests {
521
538
522
539
#[ test]
523
540
fn upsert_assert_prefer_header ( ) {
524
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . upsert ( "ignored" ) ;
541
+ let client = Client :: new ( ) ;
542
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . upsert ( "ignored" ) ;
525
543
assert_eq ! (
526
544
builder. headers. get( "Prefer" ) . unwrap( ) ,
527
545
HeaderValue :: from_static( "return=representation,resolution=merge-duplicates" )
@@ -530,20 +548,24 @@ mod tests {
530
548
531
549
#[ test]
532
550
fn not_rpc_should_not_have_flag ( ) {
533
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) ) . select ( "ignored" ) ;
551
+ let client = Client :: new ( ) ;
552
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client) . select ( "ignored" ) ;
534
553
assert_eq ! ( builder. is_rpc, false ) ;
535
554
}
536
555
537
556
#[ test]
538
557
fn rpc_should_have_body_and_flag ( ) {
539
- let builder = Builder :: new ( RPC_URL , None , HeaderMap :: new ( ) ) . rpc ( "{\" a\" : 1, \" b\" : 2}" ) ;
558
+ let client = Client :: new ( ) ;
559
+ let builder =
560
+ Builder :: new ( RPC_URL , None , HeaderMap :: new ( ) , & client) . rpc ( "{\" a\" : 1, \" b\" : 2}" ) ;
540
561
assert_eq ! ( builder. body. unwrap( ) , "{\" a\" : 1, \" b\" : 2}" ) ;
541
562
assert_eq ! ( builder. is_rpc, true ) ;
542
563
}
543
564
544
565
#[ test]
545
566
fn chain_filters ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
546
- let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) )
567
+ let client = Client :: new ( ) ;
568
+ let builder = Builder :: new ( TABLE_URL , None , HeaderMap :: new ( ) , & client)
547
569
. eq ( "username" , "supabot" )
548
570
. neq ( "message" , "hello world" )
549
571
. gte ( "channel_id" , "1" )
0 commit comments