99// This lint is overly pedantic and annoying
1010#![ allow( clippy:: needless_lifetimes) ]
1111
12+ use std:: borrow:: Cow ;
13+
1214use bon:: { bon, builder, Builder } ;
1315
1416mod formatter;
@@ -66,7 +68,7 @@ pub struct FormatOptions<'a> {
6668 dialect : Dialect ,
6769 /// Replacements for the placeholders in the query
6870 #[ builder( default , into) ]
69- params : QueryParams ,
71+ params : QueryParams < ' a > ,
7072}
7173
7274impl < ' a > FormatOptions < ' a > {
@@ -88,9 +90,9 @@ impl<'a> FormatOptions<'a> {
8890 }
8991 )
9092 ) ]
91- pub fn with_params (
93+ pub fn with_params < ' b > (
9294 & self ,
93- #[ builder( start_fn, into) ] params : QueryParams ,
95+ #[ builder( start_fn, into) ] params : QueryParams < ' b > ,
9496 #[ builder( finish_fn) ] query : & str ,
9597 ) -> String {
9698 let tokens = tokenizer:: tokenize ( query, params. is_named ( ) , self ) ;
@@ -132,26 +134,38 @@ impl Default for Indent {
132134}
133135
134136#[ derive( Debug , Clone , Default ) ]
135- pub enum QueryParams {
136- Named ( Vec < ( String , String ) > ) ,
137- Indexed ( Vec < String > ) ,
137+ pub enum QueryParams < ' a > {
138+ Named ( Cow < ' a , [ ( String , String ) ] > ) ,
139+ Indexed ( Cow < ' a , [ String ] > ) ,
138140 #[ default]
139141 None ,
140142}
141143
142- impl From < Vec < ( String , String ) > > for QueryParams {
144+ impl < ' a > From < Vec < ( String , String ) > > for QueryParams < ' a > {
143145 fn from ( value : Vec < ( String , String ) > ) -> Self {
144- Self :: Named ( value)
146+ Self :: Named ( Cow :: Owned ( value) )
145147 }
146148}
147149
148- impl From < Vec < String > > for QueryParams {
150+ impl < ' a > From < Vec < String > > for QueryParams < ' a > {
149151 fn from ( value : Vec < String > ) -> Self {
150- Self :: Indexed ( value)
152+ Self :: Indexed ( Cow :: Owned ( value) )
153+ }
154+ }
155+
156+ impl < ' a > From < & ' a [ ( String , String ) ] > for QueryParams < ' a > {
157+ fn from ( value : & ' a [ ( String , String ) ] ) -> Self {
158+ Self :: Named ( Cow :: Borrowed ( value) )
151159 }
152160}
153161
154- impl QueryParams {
162+ impl < ' a > From < & ' a [ String ] > for QueryParams < ' a > {
163+ fn from ( value : & ' a [ String ] ) -> Self {
164+ Self :: Indexed ( Cow :: Borrowed ( value) )
165+ }
166+ }
167+
168+ impl < ' a > QueryParams < ' a > {
155169 fn is_named ( & self ) -> bool {
156170 matches ! ( self , QueryParams :: Named ( _) )
157171 }
@@ -1532,15 +1546,15 @@ mod tests {
15321546 fn it_recognizes_at_variables_with_param_values ( ) {
15331547 let input =
15341548 "SELECT @variable, @a1_2.3$, @'var name', @\" var name\" , @`var name`, @[var name], @'var\\ name';" ;
1535- let params = vec ! [
1549+ let params = [
15361550 ( "variable" . to_string ( ) , "\" variable value\" " . to_string ( ) ) ,
15371551 ( "a1_2.3$" . to_string ( ) , "'weird value'" . to_string ( ) ) ,
15381552 ( "var name" . to_string ( ) , "'var value'" . to_string ( ) ) ,
15391553 ( "var\\ name" . to_string ( ) , "'var\\ value'" . to_string ( ) ) ,
15401554 ] ;
15411555 let options = FormatOptions :: builder ( )
15421556 . dialect ( Dialect :: SQLServer )
1543- . params ( params) ;
1557+ . params ( params. as_ref ( ) ) ;
15441558 let expected = indoc ! (
15451559 "
15461560 SELECT
@@ -1653,12 +1667,12 @@ mod tests {
16531667 #[ test]
16541668 fn it_recognizes_question_indexed_placeholders_with_param_values ( ) {
16551669 let input = "SELECT ?, ?, ?;" ;
1656- let params = vec ! [
1670+ let params = [
16571671 "first" . to_string ( ) ,
16581672 "second" . to_string ( ) ,
16591673 "third" . to_string ( ) ,
16601674 ] ;
1661- let options = FormatOptions :: builder ( ) . params ( params) ;
1675+ let options = FormatOptions :: builder ( ) . params ( params. as_ref ( ) ) ;
16621676 let expected = indoc ! (
16631677 "
16641678 SELECT
0 commit comments