Skip to content

Commit 3403743

Browse files
siddharthborderwalasoedirgo
authored andcommitted
reuse the client as recommended by reqwest.
refactor execute fn into idiomatic and easily readable rust code.
1 parent 204e827 commit 3403743

File tree

3 files changed

+63
-38
lines changed

3 files changed

+63
-38
lines changed

src/builder.rs

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use reqwest::{
33
Client, Error, Method, Response,
44
};
55

6-
pub struct Builder {
6+
/// QueryBuilder struct
7+
pub struct Builder<'a> {
78
method: Method,
89
url: String,
910
schema: Option<String>,
@@ -12,12 +13,15 @@ pub struct Builder {
1213
headers: HeaderMap,
1314
body: Option<String>,
1415
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,
1519
}
1620

1721
// TODO: Test Unicode support
18-
impl Builder {
22+
impl<'a> Builder<'a> {
1923
/// 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
2125
where
2226
T: Into<String>,
2327
{
@@ -29,6 +33,7 @@ impl Builder {
2933
headers,
3034
body: None,
3135
is_rpc: false,
36+
client,
3237
};
3338
builder
3439
.headers
@@ -421,26 +426,31 @@ impl Builder {
421426

422427
/// Executes the PostgREST request.
423428
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
444454
}
445455
}
446456

@@ -453,7 +463,8 @@ mod tests {
453463

454464
#[test]
455465
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);
457468
assert_eq!(
458469
builder.headers.get("Accept").unwrap(),
459470
HeaderValue::from_static("application/json")
@@ -462,7 +473,8 @@ mod tests {
462473

463474
#[test]
464475
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");
466478
assert_eq!(
467479
builder.headers.get("Authorization").unwrap(),
468480
HeaderValue::from_static("Bearer $Up3rS3crET")
@@ -471,7 +483,8 @@ mod tests {
471483

472484
#[test]
473485
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");
475488
assert_eq!(builder.method, Method::GET);
476489
assert_eq!(
477490
builder
@@ -483,7 +496,8 @@ mod tests {
483496

484497
#[test]
485498
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");
487501
assert_eq!(
488502
builder
489503
.queries
@@ -494,7 +508,8 @@ mod tests {
494508

495509
#[test]
496510
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);
498513
assert_eq!(
499514
builder.headers.get("Range").unwrap(),
500515
HeaderValue::from_static("0-19")
@@ -503,7 +518,8 @@ mod tests {
503518

504519
#[test]
505520
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);
507523
assert_eq!(
508524
builder.headers.get("Range").unwrap(),
509525
HeaderValue::from_static("10-20")
@@ -512,7 +528,8 @@ mod tests {
512528

513529
#[test]
514530
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();
516533
assert_eq!(
517534
builder.headers.get("Accept").unwrap(),
518535
HeaderValue::from_static("application/vnd.pgrst.object+json")
@@ -521,7 +538,8 @@ mod tests {
521538

522539
#[test]
523540
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");
525543
assert_eq!(
526544
builder.headers.get("Prefer").unwrap(),
527545
HeaderValue::from_static("return=representation,resolution=merge-duplicates")
@@ -530,20 +548,24 @@ mod tests {
530548

531549
#[test]
532550
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");
534553
assert_eq!(builder.is_rpc, false);
535554
}
536555

537556
#[test]
538557
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}");
540561
assert_eq!(builder.body.unwrap(), "{\"a\": 1, \"b\": 2}");
541562
assert_eq!(builder.is_rpc, true);
542563
}
543564

544565
#[test]
545566
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)
547569
.eq("username", "supabot")
548570
.neq("message", "hello world")
549571
.gte("channel_id", "1")

src/filter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn clean_param(param: &str) -> Cow<str> {
1010
}
1111
}
1212

13-
impl Builder {
13+
impl Builder<'_> {
1414
/// Finds all rows which doesn't satisfy the filter.
1515
///
1616
/// # Example

src/lib.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,13 @@ mod filter;
7979

8080
pub use builder::Builder;
8181
use reqwest::header::{HeaderMap, HeaderValue, IntoHeaderName};
82+
use reqwest::Client;
8283

8384
pub struct Postgrest {
8485
url: String,
8586
schema: Option<String>,
8687
headers: HeaderMap,
88+
client: Client,
8789
}
8890

8991
impl Postgrest {
@@ -104,6 +106,7 @@ impl Postgrest {
104106
url: url.into(),
105107
schema: None,
106108
headers: HeaderMap::new(),
109+
client: Client::new(),
107110
}
108111
}
109112

@@ -129,7 +132,7 @@ impl Postgrest {
129132
self
130133
}
131134

132-
/// Add arbitrary headers to the request. For instance when you may want to connect
135+
/// Add arbitrary headers to the request. For instance when you may want to connect
133136
/// through an API gateway that needs an API key header.
134137
///
135138
/// # Example
@@ -168,7 +171,7 @@ impl Postgrest {
168171
T: AsRef<str>,
169172
{
170173
let url = format!("{}/{}", self.url, table.as_ref());
171-
Builder::new(url, self.schema.clone(), self.headers.clone())
174+
Builder::new(url, self.schema.clone(), self.headers.clone(), &self.client)
172175
}
173176

174177
/// Perform a stored procedure call.
@@ -187,7 +190,7 @@ impl Postgrest {
187190
U: Into<String>,
188191
{
189192
let url = format!("{}/rpc/{}", self.url, function.as_ref());
190-
Builder::new(url, self.schema.clone(), self.headers.clone()).rpc(params)
193+
Builder::new(url, self.schema.clone(), self.headers.clone(), &self.client).rpc(params)
191194
}
192195
}
193196

0 commit comments

Comments
 (0)