Skip to content

Commit f1163c5

Browse files
jshearersoedirgo
authored andcommitted
refactor: Allow Builder to be cloned by removing unneccesary reference and lifetime. request::Client is already cloneable since it's just an Arc<ClientRef>. So let's get rid of all of the &'a Client stuff and instead just have Builder own a Client, and clone it when needed.
1 parent 9cc52cc commit f1163c5

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

src/builder.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use reqwest::{
44
};
55

66
/// QueryBuilder struct
7-
pub struct Builder<'a> {
7+
#[derive(Clone)]
8+
pub struct Builder {
89
method: Method,
910
url: String,
1011
schema: Option<String>,
@@ -15,13 +16,13 @@ pub struct Builder<'a> {
1516
is_rpc: bool,
1617
// sharing a client is a good idea, performance wise
1718
// the client has to live at least as much as the builder
18-
client: &'a Client,
19+
client: Client,
1920
}
2021

2122
// TODO: Test Unicode support
22-
impl<'a> Builder<'a> {
23+
impl Builder {
2324
/// Creates a new `Builder` with the specified `schema`.
24-
pub fn new<T>(url: T, schema: Option<String>, headers: HeaderMap, client: &'a Client) -> Self
25+
pub fn new<T>(url: T, schema: Option<String>, headers: HeaderMap, client: Client) -> Self
2526
where
2627
T: Into<String>,
2728
{
@@ -584,7 +585,7 @@ mod tests {
584585
#[test]
585586
fn only_accept_json() {
586587
let client = Client::new();
587-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client);
588+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client);
588589
assert_eq!(
589590
builder.headers.get("Accept").unwrap(),
590591
HeaderValue::from_static("application/json")
@@ -594,7 +595,7 @@ mod tests {
594595
#[test]
595596
fn auth_with_token() {
596597
let client = Client::new();
597-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).auth("$Up3rS3crET");
598+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).auth("$Up3rS3crET");
598599
assert_eq!(
599600
builder.headers.get("Authorization").unwrap(),
600601
HeaderValue::from_static("Bearer $Up3rS3crET")
@@ -604,7 +605,7 @@ mod tests {
604605
#[test]
605606
fn select_assert_query() {
606607
let client = Client::new();
607-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).select("some_table");
608+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).select("some_table");
608609
assert_eq!(builder.method, Method::GET);
609610
assert_eq!(
610611
builder
@@ -617,7 +618,7 @@ mod tests {
617618
#[test]
618619
fn order_assert_query() {
619620
let client = Client::new();
620-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).order("id");
621+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).order("id");
621622
assert_eq!(
622623
builder
623624
.queries
@@ -629,7 +630,7 @@ mod tests {
629630
#[test]
630631
fn order_with_options_assert_query() {
631632
let client = Client::new();
632-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).order_with_options(
633+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).order_with_options(
633634
"name",
634635
Some("cities"),
635636
true,
@@ -646,7 +647,7 @@ mod tests {
646647
#[test]
647648
fn limit_assert_range_header() {
648649
let client = Client::new();
649-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).limit(20);
650+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).limit(20);
650651
assert_eq!(
651652
builder.headers.get("Range").unwrap(),
652653
HeaderValue::from_static("0-19")
@@ -656,7 +657,7 @@ mod tests {
656657
#[test]
657658
fn foreign_table_limit_assert_query() {
658659
let client = Client::new();
659-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client)
660+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client)
660661
.foreign_table_limit(20, "some_table");
661662
assert_eq!(
662663
builder
@@ -669,7 +670,7 @@ mod tests {
669670
#[test]
670671
fn range_assert_range_header() {
671672
let client = Client::new();
672-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).range(10, 20);
673+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).range(10, 20);
673674
assert_eq!(
674675
builder.headers.get("Range").unwrap(),
675676
HeaderValue::from_static("10-20")
@@ -679,7 +680,7 @@ mod tests {
679680
#[test]
680681
fn single_assert_accept_header() {
681682
let client = Client::new();
682-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).single();
683+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).single();
683684
assert_eq!(
684685
builder.headers.get("Accept").unwrap(),
685686
HeaderValue::from_static("application/vnd.pgrst.object+json")
@@ -689,7 +690,7 @@ mod tests {
689690
#[test]
690691
fn upsert_assert_prefer_header() {
691692
let client = Client::new();
692-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).upsert("ignored");
693+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).upsert("ignored");
693694
assert_eq!(
694695
builder.headers.get("Prefer").unwrap(),
695696
HeaderValue::from_static("return=representation,resolution=merge-duplicates")
@@ -699,23 +700,23 @@ mod tests {
699700
#[test]
700701
fn not_rpc_should_not_have_flag() {
701702
let client = Client::new();
702-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client).select("ignored");
703+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client).select("ignored");
703704
assert_eq!(builder.is_rpc, false);
704705
}
705706

706707
#[test]
707708
fn rpc_should_have_body_and_flag() {
708709
let client = Client::new();
709710
let builder =
710-
Builder::new(RPC_URL, None, HeaderMap::new(), &client).rpc("{\"a\": 1, \"b\": 2}");
711+
Builder::new(RPC_URL, None, HeaderMap::new(), client).rpc("{\"a\": 1, \"b\": 2}");
711712
assert_eq!(builder.body.unwrap(), "{\"a\": 1, \"b\": 2}");
712713
assert_eq!(builder.is_rpc, true);
713714
}
714715

715716
#[test]
716717
fn chain_filters() -> Result<(), Box<dyn std::error::Error>> {
717718
let client = Client::new();
718-
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), &client)
719+
let builder = Builder::new(TABLE_URL, None, HeaderMap::new(), client)
719720
.eq("username", "supabot")
720721
.neq("message", "hello world")
721722
.gte("channel_id", "1")

src/filter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::Builder;
22

3-
impl Builder<'_> {
3+
impl Builder {
44
/// Finds all rows which doesn't satisfy the filter.
55
///
66
/// # Example

src/lib.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,12 @@ impl Postgrest {
171171
T: AsRef<str>,
172172
{
173173
let url = format!("{}/{}", self.url, table.as_ref());
174-
Builder::new(url, self.schema.clone(), self.headers.clone(), &self.client)
174+
Builder::new(
175+
url,
176+
self.schema.clone(),
177+
self.headers.clone(),
178+
self.client.clone(),
179+
)
175180
}
176181

177182
/// Perform a stored procedure call.
@@ -190,7 +195,13 @@ impl Postgrest {
190195
U: Into<String>,
191196
{
192197
let url = format!("{}/rpc/{}", self.url, function.as_ref());
193-
Builder::new(url, self.schema.clone(), self.headers.clone(), &self.client).rpc(params)
198+
Builder::new(
199+
url,
200+
self.schema.clone(),
201+
self.headers.clone(),
202+
self.client.clone(),
203+
)
204+
.rpc(params)
194205
}
195206
}
196207

0 commit comments

Comments
 (0)