sqlx_cloudflare_do/
arguments.rs1use sqlx_cloudflare_core::add_argument;
2use sqlx_core::arguments::Arguments;
3use sqlx_core::encode::Encode;
4use sqlx_core::error::BoxDynError;
5use sqlx_core::types::Type;
6
7use crate::{Do, DoArgumentValue};
8
9#[derive(Debug, Default, Clone)]
13pub struct DoArguments {
14 pub(crate) values: Vec<DoArgumentValue>,
15}
16
17impl DoArguments {
18 pub(crate) fn values(&self) -> &[DoArgumentValue] {
19 &self.values
20 }
21}
22
23impl Arguments for DoArguments {
24 type Database = Do;
25
26 fn reserve(&mut self, additional: usize, _size: usize) {
27 self.values.reserve(additional);
28 }
29
30 fn add<'t, T>(&mut self, value: T) -> Result<(), BoxDynError>
31 where
32 T: Encode<'t, Do> + Type<Do>,
33 {
34 add_argument(&mut self.values, value)
35 }
36
37 fn len(&self) -> usize {
38 self.values.len()
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use sqlx_core::arguments::Arguments;
45
46 use super::{DoArgumentValue, DoArguments};
47
48 #[test]
49 fn values_line_up_with_placeholders() {
50 let mut arguments = DoArguments::default();
51
52 arguments.add(7_i64).unwrap();
53 arguments.add(Option::<String>::None).unwrap();
54 arguments.add("x").unwrap();
55 arguments.add(true).unwrap();
56 arguments.add(1.5_f64).unwrap();
57 arguments.add(vec![1_u8, 2]).unwrap();
58
59 assert_eq!(
60 arguments.values(),
61 [
62 DoArgumentValue::Integer(7),
63 DoArgumentValue::Null,
64 DoArgumentValue::Text("x".into()),
65 DoArgumentValue::Integer(1),
66 DoArgumentValue::Real(1.5),
67 DoArgumentValue::Blob(vec![1, 2]),
68 ]
69 );
70 }
71
72 #[test]
73 fn an_integer_beyond_2_53_is_refused_and_leaves_no_trace() {
74 let mut arguments = DoArguments::default();
75
76 arguments.add(1_i64).unwrap();
77 assert!(arguments.add(1_i64 << 53).is_err());
78 assert!(arguments.add(i64::MIN).is_err());
79 arguments.add(2_i64).unwrap();
80
81 assert_eq!(
83 arguments.values(),
84 [DoArgumentValue::Integer(1), DoArgumentValue::Integer(2)]
85 );
86 }
87}