8
8
//! ```
9
9
//! use query_string_builder::QueryString;
10
10
//!
11
- //! let qs = QueryString::new ()
11
+ //! let qs = QueryString::dynamic ()
12
12
//! .with_value("q", "🍎 apple")
13
13
//! .with_value("tasty", true)
14
14
//! .with_opt_value("color", None::<String>)
22
22
23
23
#![ deny( unsafe_code) ]
24
24
25
- use std :: fmt :: { Debug , Display , Formatter , Write } ;
25
+ mod slim ;
26
26
27
27
use percent_encoding:: { utf8_percent_encode, AsciiSet , CONTROLS } ;
28
+ use std:: fmt:: { Debug , Display , Formatter , Write } ;
29
+
30
+ pub use slim:: { QueryStringSimple , WrappedQueryString } ;
28
31
29
32
/// https://url.spec.whatwg.org/#query-percent-encode-set
30
- const QUERY : & AsciiSet = & CONTROLS
33
+ pub ( crate ) const QUERY : & AsciiSet = & CONTROLS
31
34
. add ( b' ' )
32
35
. add ( b'"' )
33
36
. add ( b'#' )
@@ -50,7 +53,7 @@ const QUERY: &AsciiSet = &CONTROLS
50
53
/// ```
51
54
/// use query_string_builder::QueryString;
52
55
///
53
- /// let qs = QueryString::new ()
56
+ /// let qs = QueryString::dynamic ()
54
57
/// .with_value("q", "apple")
55
58
/// .with_value("category", "fruits and vegetables");
56
59
///
@@ -59,14 +62,38 @@ const QUERY: &AsciiSet = &CONTROLS
59
62
/// "https://example.com/?q=apple&category=fruits%20and%20vegetables"
60
63
/// );
61
64
/// ```
62
- #[ derive( Debug , Default , Clone ) ]
65
+ #[ derive( Debug , Clone ) ]
63
66
pub struct QueryString {
64
67
pairs : Vec < Kvp > ,
65
68
}
66
69
67
70
impl QueryString {
68
71
/// Creates a new, empty query string builder.
69
- pub fn new ( ) -> Self {
72
+ ///
73
+ /// ## Example
74
+ ///
75
+ /// ```
76
+ /// use query_string_builder::QueryString;
77
+ ///
78
+ /// let weight: &f32 = &99.9;
79
+ ///
80
+ /// let qs = QueryString::simple()
81
+ /// .with_value("q", "apple")
82
+ /// .with_value("category", "fruits and vegetables")
83
+ /// .with_opt_value("weight", Some(weight));
84
+ ///
85
+ /// assert_eq!(
86
+ /// format!("https://example.com/{qs}"),
87
+ /// "https://example.com/?q=apple&category=fruits%20and%20vegetables&weight=99.9"
88
+ /// );
89
+ /// ```
90
+ #[ allow( clippy:: new_ret_no_self) ]
91
+ pub fn simple ( ) -> QueryStringSimple {
92
+ QueryStringSimple :: default ( )
93
+ }
94
+
95
+ /// Creates a new, empty query string builder.
96
+ pub fn dynamic ( ) -> Self {
70
97
Self {
71
98
pairs : Vec :: default ( ) ,
72
99
}
@@ -79,7 +106,7 @@ impl QueryString {
79
106
/// ```
80
107
/// use query_string_builder::QueryString;
81
108
///
82
- /// let qs = QueryString::new ()
109
+ /// let qs = QueryString::dynamic ()
83
110
/// .with_value("q", "🍎 apple")
84
111
/// .with_value("category", "fruits and vegetables")
85
112
/// .with_value("answer", 42);
@@ -104,7 +131,7 @@ impl QueryString {
104
131
/// ```
105
132
/// use query_string_builder::QueryString;
106
133
///
107
- /// let qs = QueryString::new ()
134
+ /// let qs = QueryString::dynamic ()
108
135
/// .with_opt_value("q", Some("🍎 apple"))
109
136
/// .with_opt_value("f", None::<String>)
110
137
/// .with_opt_value("category", Some("fruits and vegetables"))
@@ -130,7 +157,7 @@ impl QueryString {
130
157
/// ```
131
158
/// use query_string_builder::QueryString;
132
159
///
133
- /// let mut qs = QueryString::new ();
160
+ /// let mut qs = QueryString::dynamic ();
134
161
/// qs.push("q", "apple");
135
162
/// qs.push("category", "fruits and vegetables");
136
163
///
@@ -154,7 +181,7 @@ impl QueryString {
154
181
/// ```
155
182
/// use query_string_builder::QueryString;
156
183
///
157
- /// let mut qs = QueryString::new ();
184
+ /// let mut qs = QueryString::dynamic ();
158
185
/// qs.push_opt("q", None::<String>);
159
186
/// qs.push_opt("q", Some("🍎 apple"));
160
187
///
@@ -188,8 +215,8 @@ impl QueryString {
188
215
/// ```
189
216
/// use query_string_builder::QueryString;
190
217
///
191
- /// let mut qs = QueryString::new ().with_value("q", "apple");
192
- /// let more = QueryString::new ().with_value("q", "pear");
218
+ /// let mut qs = QueryString::dynamic ().with_value("q", "apple");
219
+ /// let more = QueryString::dynamic ().with_value("q", "pear");
193
220
///
194
221
/// qs.append(more);
195
222
///
@@ -209,8 +236,8 @@ impl QueryString {
209
236
/// ```
210
237
/// use query_string_builder::QueryString;
211
238
///
212
- /// let qs = QueryString::new ().with_value("q", "apple");
213
- /// let more = QueryString::new ().with_value("q", "pear");
239
+ /// let qs = QueryString::dynamic ().with_value("q", "apple");
240
+ /// let more = QueryString::dynamic ().with_value("q", "pear");
214
241
///
215
242
/// let qs = qs.append_into(more);
216
243
///
@@ -257,15 +284,15 @@ mod tests {
257
284
258
285
#[ test]
259
286
fn test_empty ( ) {
260
- let qs = QueryString :: new ( ) ;
287
+ let qs = QueryStringSimple :: default ( ) ;
261
288
assert_eq ! ( qs. to_string( ) , "" ) ;
262
289
assert_eq ! ( qs. len( ) , 0 ) ;
263
290
assert ! ( qs. is_empty( ) ) ;
264
291
}
265
292
266
293
#[ test]
267
294
fn test_simple ( ) {
268
- let qs = QueryString :: new ( )
295
+ let qs = QueryString :: dynamic ( )
269
296
. with_value ( "q" , "apple???" )
270
297
. with_value ( "category" , "fruits and vegetables" )
271
298
. with_value ( "tasty" , true )
@@ -280,15 +307,15 @@ mod tests {
280
307
281
308
#[ test]
282
309
fn test_encoding ( ) {
283
- let qs = QueryString :: new ( )
310
+ let qs = QueryString :: dynamic ( )
284
311
. with_value ( "q" , "Grünkohl" )
285
312
. with_value ( "category" , "Gemüse" ) ;
286
313
assert_eq ! ( qs. to_string( ) , "?q=Gr%C3%BCnkohl&category=Gem%C3%BCse" ) ;
287
314
}
288
315
289
316
#[ test]
290
317
fn test_emoji ( ) {
291
- let qs = QueryString :: new ( )
318
+ let qs = QueryString :: dynamic ( )
292
319
. with_value ( "q" , "🥦" )
293
320
. with_value ( "🍽️" , "🍔🍕" ) ;
294
321
assert_eq ! (
@@ -299,7 +326,7 @@ mod tests {
299
326
300
327
#[ test]
301
328
fn test_optional ( ) {
302
- let qs = QueryString :: new ( )
329
+ let qs = QueryString :: dynamic ( )
303
330
. with_value ( "q" , "celery" )
304
331
. with_opt_value ( "taste" , None :: < String > )
305
332
. with_opt_value ( "category" , Some ( "fruits and vegetables" ) )
@@ -314,7 +341,7 @@ mod tests {
314
341
315
342
#[ test]
316
343
fn test_push_optional ( ) {
317
- let mut qs = QueryString :: new ( ) ;
344
+ let mut qs = QueryString :: dynamic ( ) ;
318
345
qs. push ( "a" , "apple" ) ;
319
346
qs. push_opt ( "b" , None :: < String > ) ;
320
347
qs. push_opt ( "c" , Some ( "🍎 apple" ) ) ;
@@ -327,11 +354,11 @@ mod tests {
327
354
328
355
#[ test]
329
356
fn test_append ( ) {
330
- let qs = QueryString :: new ( ) . with_value ( "q" , "apple" ) ;
331
- let more = QueryString :: new ( ) . with_value ( "q" , "pear" ) ;
357
+ let qs = QueryString :: dynamic ( ) . with_value ( "q" , "apple" ) ;
358
+ let more = QueryString :: dynamic ( ) . with_value ( "q" , "pear" ) ;
332
359
333
360
let mut qs = qs. append_into ( more) ;
334
- qs. append ( QueryString :: new ( ) . with_value ( "answer" , "42" ) ) ;
361
+ qs. append ( QueryString :: dynamic ( ) . with_value ( "answer" , "42" ) ) ;
335
362
336
363
assert_eq ! (
337
364
format!( "https://example.com/{qs}" ) ,
@@ -371,7 +398,7 @@ mod tests {
371
398
( "right_curly" , "}" , "}" ) ,
372
399
] ;
373
400
374
- let mut qs = QueryString :: new ( ) ;
401
+ let mut qs = QueryString :: dynamic ( ) ;
375
402
for ( key, value, _) in & tests {
376
403
qs. push ( key. to_string ( ) , value. to_string ( ) ) ;
377
404
}
0 commit comments