Skip to content

Commit 5adffcc

Browse files
committed
Use a Cow in QueryParams
1 parent 16aa914 commit 5adffcc

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

src/lib.rs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// This lint is overly pedantic and annoying
1010
#![allow(clippy::needless_lifetimes)]
1111

12+
use std::borrow::Cow;
13+
1214
use bon::{bon, builder, Builder};
1315

1416
mod 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

7274
impl<'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

src/params.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::QueryParams;
33

44
pub(crate) struct Params<'a> {
55
index: usize,
6-
params: &'a QueryParams,
6+
params: &'a QueryParams<'a>,
77
}
88

99
impl<'a> Params<'a> {

0 commit comments

Comments
 (0)