sqlx_cloudflare_core/arguments.rs
1use sqlx_core::database::Database;
2use sqlx_core::encode::{Encode, IsNull};
3use sqlx_core::error::BoxDynError;
4use sqlx_core::types::Type;
5
6use crate::Value;
7
8/// Encodes `value` onto `values`, as one placeholder's worth.
9///
10/// What a driver's `Arguments::add` does: whatever the encoder does, exactly
11/// one value lands for the placeholder, or none if it fails.
12///
13/// # Errors
14///
15/// When encoding fails, in which case `values` is left as it was.
16pub fn add_argument<'t, DB, T>(values: &mut Vec<Value>, value: T) -> Result<(), BoxDynError>
17where
18 DB: Database<ArgumentBuffer = Vec<Value>>,
19 T: Encode<'t, DB> + Type<DB>,
20{
21 let len = values.len();
22
23 match value.encode(values) {
24 Ok(IsNull::Yes) => {
25 // An encoder that reports NULL may still have pushed something;
26 // the placeholder must line up with exactly one value.
27 values.truncate(len);
28 values.push(Value::Null);
29 }
30 Ok(IsNull::No) => {}
31 Err(error) => {
32 // Leave the arguments as they were, so a failed bind cannot shift
33 // every later parameter one placeholder to the right.
34 values.truncate(len);
35 return Err(error);
36 }
37 }
38
39 Ok(())
40}