use std::fmt::Write;
pub fn in_params(start: usize, count: usize) -> String {
assert!(count > 0, "IN clause requires at least one parameter");
let mut s = String::with_capacity(count * 5);
s.push('(');
for i in 0..count {
if i > 0 {
s.push_str(", ");
}
write!(s, "@p{}", start + i).unwrap();
}
s.push(')');
s
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_in_params_single() {
assert_eq!(in_params(1, 1), "(@p1)");
}
#[test]
fn test_in_params_multiple() {
assert_eq!(in_params(1, 3), "(@p1, @p2, @p3)");
}
#[test]
fn test_in_params_with_offset() {
assert_eq!(in_params(4, 2), "(@p4, @p5)");
}
#[test]
fn test_in_params_large() {
let result = in_params(1, 5);
assert_eq!(result, "(@p1, @p2, @p3, @p4, @p5)");
}
#[test]
fn test_in_params_format_into_sql() {
let sql = format!(
"SELECT * FROM users WHERE status = @p1 AND id IN {}",
in_params(2, 3)
);
assert_eq!(
sql,
"SELECT * FROM users WHERE status = @p1 AND id IN (@p2, @p3, @p4)"
);
}
#[test]
#[should_panic(expected = "IN clause requires at least one parameter")]
fn test_in_params_zero_count_panics() {
in_params(1, 0);
}
}