@@ -20,11 +20,15 @@ pub struct Builder {
20
20
// TODO: Exact, planned, estimated count (HEAD verb)
21
21
// TODO: Response format
22
22
// TODO: Embedded resources
23
+ // TODO: Content type (csv, etc.)
23
24
impl Builder {
24
- pub fn new ( url : & str , schema : Option < String > ) -> Self {
25
+ pub fn new < S > ( url : S , schema : Option < String > ) -> Self
26
+ where
27
+ S : Into < String > ,
28
+ {
25
29
let mut builder = Builder {
26
30
method : Method :: GET ,
27
- url : url. to_string ( ) ,
31
+ url : url. into ( ) ,
28
32
schema,
29
33
headers : HeaderMap :: new ( ) ,
30
34
..Default :: default ( )
@@ -35,10 +39,13 @@ impl Builder {
35
39
builder
36
40
}
37
41
38
- pub fn auth ( mut self , token : & str ) -> Self {
42
+ pub fn auth < S > ( mut self , token : S ) -> Self
43
+ where
44
+ S : Into < String > ,
45
+ {
39
46
self . headers . append (
40
47
"Authorization" ,
41
- HeaderValue :: from_str ( & format ! ( "Bearer {}" , token) ) . unwrap ( ) ,
48
+ HeaderValue :: from_str ( & format ! ( "Bearer {}" , token. into ( ) ) ) . unwrap ( ) ,
42
49
) ;
43
50
self
44
51
}
@@ -49,19 +56,24 @@ impl Builder {
49
56
// TODO: JSON columns
50
57
// TODO: Computed (virtual) columns
51
58
// TODO: Investigate character corner cases (Unicode, [ .,:()])
52
- pub fn select ( mut self , column : & str ) -> Self {
59
+ pub fn select < S > ( mut self , column : S ) -> Self
60
+ where
61
+ S : Into < String > ,
62
+ {
53
63
self . method = Method :: GET ;
54
- self . queries
55
- . push ( ( "select" . to_string ( ) , column. to_string ( ) ) ) ;
64
+ self . queries . push ( ( "select" . to_string ( ) , column. into ( ) ) ) ;
56
65
self
57
66
}
58
67
59
68
// TODO: desc/asc
60
69
// TODO: nullsfirst/nullslast
61
70
// TODO: Multiple columns
62
71
// TODO: Computed columns
63
- pub fn order ( mut self , column : & str ) -> Self {
64
- self . queries . push ( ( "order" . to_string ( ) , column. to_string ( ) ) ) ;
72
+ pub fn order < S > ( mut self , column : S ) -> Self
73
+ where
74
+ S : Into < String > ,
75
+ {
76
+ self . queries . push ( ( "order" . to_string ( ) , column. into ( ) ) ) ;
65
77
self
66
78
}
67
79
@@ -96,48 +108,56 @@ impl Builder {
96
108
// TODO: Write-only tables
97
109
// TODO: URL-encoded payload
98
110
// TODO: Allow specifying columns
99
- pub fn insert ( mut self , body : & str ) -> Self {
111
+ pub fn insert < S > ( mut self , body : S ) -> Self
112
+ where
113
+ S : Into < String > ,
114
+ {
100
115
self . method = Method :: POST ;
101
116
self . headers
102
117
. insert ( "Prefer" , HeaderValue :: from_static ( "return=representation" ) ) ;
103
- self . body = Some ( body. to_string ( ) ) ;
118
+ self . body = Some ( body. into ( ) ) ;
104
119
self
105
120
}
106
121
107
- pub fn insert_csv ( mut self , body : & str ) -> Self {
108
- self . headers
109
- . insert ( "Content-Type" , HeaderValue :: from_static ( "text/csv" ) ) ;
110
- self . insert ( body)
111
- }
112
-
113
122
// TODO: Allow Prefer: resolution=ignore-duplicates
114
123
// TODO: on_conflict (make UPSERT work on UNIQUE columns)
115
- pub fn upsert ( mut self , body : & str ) -> Self {
124
+ pub fn upsert < S > ( mut self , body : S ) -> Self
125
+ where
126
+ S : Into < String > ,
127
+ {
116
128
self . method = Method :: POST ;
117
129
self . headers . append (
118
130
"Prefer" ,
119
131
// Maybe check if this works as intended...
120
132
HeaderValue :: from_static ( "return=representation; resolution=merge-duplicates" ) ,
121
133
) ;
122
- self . body = Some ( body. to_string ( ) ) ;
134
+ self . body = Some ( body. into ( ) ) ;
123
135
self
124
136
}
125
137
126
- pub fn single_upsert ( mut self , primary_column : & str , key : & str , body : & str ) -> Self {
138
+ pub fn single_upsert < S , T , U > ( mut self , primary_column : S , key : T , body : U ) -> Self
139
+ where
140
+ S : Into < String > ,
141
+ T : Into < String > ,
142
+ U : Into < String > ,
143
+ {
127
144
self . method = Method :: PUT ;
128
145
self . headers
129
146
. append ( "Prefer" , HeaderValue :: from_static ( "return=representation" ) ) ;
130
147
self . queries
131
- . push ( ( primary_column. to_string ( ) , format ! ( "eq.{}" , key) ) ) ;
132
- self . body = Some ( body. to_string ( ) ) ;
148
+ . push ( ( primary_column. into ( ) , format ! ( "eq.{}" , key. into ( ) ) ) ) ;
149
+ self . body = Some ( body. into ( ) ) ;
133
150
self
134
151
}
135
152
136
- pub fn update ( mut self , body : & str ) -> Self {
153
+ pub fn update < S > ( mut self , body : S ) -> Self
154
+ where
155
+ S : Into < String > ,
156
+ {
137
157
self . method = Method :: PATCH ;
138
158
self . headers
139
159
. append ( "Prefer" , HeaderValue :: from_static ( "return=representation" ) ) ;
140
- self . body = Some ( body. to_string ( ) ) ;
160
+ self . body = Some ( body. into ( ) ) ;
141
161
self
142
162
}
143
163
@@ -148,9 +168,12 @@ impl Builder {
148
168
self
149
169
}
150
170
151
- pub fn rpc ( mut self , params : & str ) -> Self {
171
+ pub fn rpc < S > ( mut self , params : S ) -> Self
172
+ where
173
+ S : Into < String > ,
174
+ {
152
175
self . method = Method :: POST ;
153
- self . body = Some ( params. to_string ( ) ) ;
176
+ self . body = Some ( params. into ( ) ) ;
154
177
self . is_rpc = true ;
155
178
self
156
179
}
@@ -178,14 +201,13 @@ impl Builder {
178
201
#[ cfg( test) ]
179
202
mod tests {
180
203
use super :: * ;
181
- use crate :: Postgrest ;
182
204
183
- const REST_URL : & str = "http://localhost:3000" ;
205
+ const TABLE_URL : & str = "http://localhost:3000/table" ;
206
+ const RPC_URL : & str = "http://localhost/rpc" ;
184
207
185
208
#[ test]
186
209
fn only_accept_json ( ) {
187
- let client = Postgrest :: new ( REST_URL ) ;
188
- let builder = client. from ( "users" ) ;
210
+ let builder = Builder :: new ( TABLE_URL , None ) ;
189
211
assert_eq ! (
190
212
builder. headers. get( "Accept" ) . unwrap( ) ,
191
213
HeaderValue :: from_static( "application/json" )
@@ -194,8 +216,7 @@ mod tests {
194
216
195
217
#[ test]
196
218
fn auth_with_token ( ) {
197
- let client = Postgrest :: new ( REST_URL ) ;
198
- let builder = client. from ( "users" ) . auth ( "$Up3rS3crET" ) ;
219
+ let builder = Builder :: new ( TABLE_URL , None ) . auth ( "$Up3rS3crET" ) ;
199
220
assert_eq ! (
200
221
builder. headers. get( "Authentication" ) . unwrap( ) ,
201
222
HeaderValue :: from_static( "Bearer $Up3rS3crET" )
@@ -204,8 +225,7 @@ mod tests {
204
225
205
226
#[ test]
206
227
fn select_assert_query ( ) {
207
- let client = Postgrest :: new ( REST_URL ) ;
208
- let builder = client. from ( "users" ) . select ( "some_table" ) ;
228
+ let builder = Builder :: new ( TABLE_URL , None ) . select ( "some_table" ) ;
209
229
assert_eq ! ( builder. method, Method :: GET ) ;
210
230
assert_eq ! (
211
231
builder
@@ -217,8 +237,7 @@ mod tests {
217
237
218
238
#[ test]
219
239
fn order_assert_query ( ) {
220
- let client = Postgrest :: new ( REST_URL ) ;
221
- let builder = client. from ( "users" ) . order ( "id" ) ;
240
+ let builder = Builder :: new ( TABLE_URL , None ) . order ( "id" ) ;
222
241
assert_eq ! (
223
242
builder
224
243
. queries
@@ -229,8 +248,7 @@ mod tests {
229
248
230
249
#[ test]
231
250
fn limit_assert_range_header ( ) {
232
- let client = Postgrest :: new ( REST_URL ) ;
233
- let builder = client. from ( "users" ) . limit ( 20 ) ;
251
+ let builder = Builder :: new ( TABLE_URL , None ) . limit ( 20 ) ;
234
252
assert_eq ! (
235
253
builder. headers. get( "Range" ) . unwrap( ) ,
236
254
HeaderValue :: from_static( "0-19" )
@@ -239,8 +257,7 @@ mod tests {
239
257
240
258
#[ test]
241
259
fn range_assert_range_header ( ) {
242
- let client = Postgrest :: new ( REST_URL ) ;
243
- let builder = client. from ( "users" ) . range ( 10 , 20 ) ;
260
+ let builder = Builder :: new ( TABLE_URL , None ) . range ( 10 , 20 ) ;
244
261
assert_eq ! (
245
262
builder. headers. get( "Range" ) . unwrap( ) ,
246
263
HeaderValue :: from_static( "10-20" )
@@ -249,28 +266,16 @@ mod tests {
249
266
250
267
#[ test]
251
268
fn single_assert_accept_header ( ) {
252
- let client = Postgrest :: new ( REST_URL ) ;
253
- let builder = client. from ( "users" ) . single ( ) ;
269
+ let builder = Builder :: new ( TABLE_URL , None ) . single ( ) ;
254
270
assert_eq ! (
255
271
builder. headers. get( "Accept" ) . unwrap( ) ,
256
272
HeaderValue :: from_static( "application/vnd.pgrst.object+json" )
257
273
) ;
258
274
}
259
275
260
- #[ test]
261
- fn insert_csv_assert_content_type ( ) {
262
- let client = Postgrest :: new ( REST_URL ) ;
263
- let builder = client. from ( "users" ) . insert_csv ( "ignored" ) ;
264
- assert_eq ! (
265
- builder. headers. get( "Content-Type" ) . unwrap( ) ,
266
- HeaderValue :: from_static( "text/csv" )
267
- ) ;
268
- }
269
-
270
276
#[ test]
271
277
fn upsert_assert_prefer_header ( ) {
272
- let client = Postgrest :: new ( REST_URL ) ;
273
- let builder = client. from ( "users" ) . upsert ( "ignored" ) ;
278
+ let builder = Builder :: new ( TABLE_URL , None ) . upsert ( "ignored" ) ;
274
279
assert_eq ! (
275
280
builder. headers. get( "Prefer" ) . unwrap( ) ,
276
281
HeaderValue :: from_static( "return=representation; resolution=merge-duplicates" )
@@ -279,29 +284,22 @@ mod tests {
279
284
280
285
#[ test]
281
286
fn single_upsert_assert_prefer_header ( ) {
282
- let client = Postgrest :: new ( REST_URL ) ;
283
- let builder = client
284
- . from ( "users" )
285
- . single_upsert ( "ignored" , "ignored" , "ignored" ) ;
287
+ let builder = Builder :: new ( TABLE_URL , None ) . single_upsert ( "ignored" , "ignored" , "ignored" ) ;
286
288
assert_eq ! (
287
289
builder. headers. get( "Prefer" ) . unwrap( ) ,
288
290
HeaderValue :: from_static( "return=representation" )
289
291
) ;
290
292
}
291
293
292
- // filters...
293
-
294
294
#[ test]
295
295
fn not_rpc_should_not_have_flag ( ) {
296
- let client = Postgrest :: new ( REST_URL ) ;
297
- let builder = client. from ( "users" ) . select ( "column" ) ;
296
+ let builder = Builder :: new ( TABLE_URL , None ) . select ( "ignored" ) ;
298
297
assert_eq ! ( builder. is_rpc, false ) ;
299
298
}
300
299
301
300
#[ test]
302
301
fn rpc_should_have_body_and_flag ( ) {
303
- let client = Postgrest :: new ( REST_URL ) ;
304
- let builder = client. from ( "users" ) . rpc ( "{\" a\" : 1, \" b\" : 2}" ) ;
302
+ let builder = Builder :: new ( RPC_URL , None ) . rpc ( "{\" a\" : 1, \" b\" : 2}" ) ;
305
303
assert_eq ! ( builder. body. unwrap( ) , "{\" a\" : 1, \" b\" : 2}" ) ;
306
304
assert_eq ! ( builder. is_rpc, true ) ;
307
305
}
0 commit comments