1
- use std:: fmt:: Display ;
1
+ use std:: fmt:: { self , Display } ;
2
2
3
3
use crate :: {
4
4
error:: { Error , Result } ,
@@ -11,19 +11,38 @@ mod bind;
11
11
pub ( crate ) mod escape;
12
12
mod ser;
13
13
14
- #[ derive( Clone ) ]
14
+ #[ derive( Debug , Clone ) ]
15
15
pub ( crate ) enum SqlBuilder {
16
16
InProgress ( Vec < Part > ) ,
17
17
Failed ( String ) ,
18
18
}
19
19
20
- #[ derive( Clone ) ]
20
+ #[ derive( Debug , Clone ) ]
21
21
pub ( crate ) enum Part {
22
22
Arg ,
23
23
Fields ,
24
24
Text ( String ) ,
25
25
}
26
26
27
+ /// Display SQL query as string.
28
+ impl fmt:: Display for SqlBuilder {
29
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
30
+ match self {
31
+ SqlBuilder :: InProgress ( parts) => {
32
+ for part in parts {
33
+ match part {
34
+ Part :: Arg => write ! ( f, "?" ) ?,
35
+ Part :: Fields => write ! ( f, "?fields" ) ?,
36
+ Part :: Text ( text) => write ! ( f, "{text}" ) ?,
37
+ }
38
+ }
39
+ }
40
+ SqlBuilder :: Failed ( err) => write ! ( f, "{err}" ) ?,
41
+ }
42
+ Ok ( ( ) )
43
+ }
44
+ }
45
+
27
46
impl SqlBuilder {
28
47
pub ( crate ) fn new ( template : & str ) -> Self {
29
48
let mut iter = template. split ( '?' ) ;
@@ -141,9 +160,29 @@ mod tests {
141
160
#[ test]
142
161
fn bound_args ( ) {
143
162
let mut sql = SqlBuilder :: new ( "SELECT ?fields FROM test WHERE a = ? AND b < ?" ) ;
163
+ assert_eq ! (
164
+ sql. to_string( ) ,
165
+ "SELECT ?fields FROM test WHERE a = ? AND b < ?"
166
+ ) ;
167
+
144
168
sql. bind_arg ( "foo" ) ;
169
+ assert_eq ! (
170
+ sql. to_string( ) ,
171
+ "SELECT ?fields FROM test WHERE a = 'foo' AND b < ?"
172
+ ) ;
173
+
145
174
sql. bind_arg ( 42 ) ;
175
+ assert_eq ! (
176
+ sql. to_string( ) ,
177
+ "SELECT ?fields FROM test WHERE a = 'foo' AND b < 42"
178
+ ) ;
179
+
146
180
sql. bind_fields :: < Row > ( ) ;
181
+ assert_eq ! (
182
+ sql. to_string( ) ,
183
+ "SELECT `a`,`b` FROM test WHERE a = 'foo' AND b < 42"
184
+ ) ;
185
+
147
186
assert_eq ! (
148
187
sql. finish( ) . unwrap( ) ,
149
188
r"SELECT `a`,`b` FROM test WHERE a = 'foo' AND b < 42"
0 commit comments