diff --git a/src/statement.rs b/src/statement.rs index 770ed79..38c1c22 100644 --- a/src/statement.rs +++ b/src/statement.rs @@ -229,6 +229,17 @@ impl Bindable for () { } } +impl Bindable for Option { + #[inline] + fn bind(self, statement: &mut Statement, i: usize) -> Result<()> { + debug_assert!(i > 0, "the indexing starts from 1"); + match self { + Some(inner) => inner.bind(statement, i), + None => ().bind(statement, i), + } + } +} + impl Readable for Value { fn read(statement: &Statement, i: usize) -> Result { Ok(match statement.kind(i) { diff --git a/tests/lib.rs b/tests/lib.rs index 28827d5..27c5750 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -186,6 +186,28 @@ fn statement_bind() { assert_eq!(ok!(statement.next()), State::Done); } +#[test] +fn statement_optional_bind() { + let connection = setup_users(":memory:"); + let statement = "INSERT INTO users VALUES (?, ?, ?, ?)"; + let mut statement = ok!(connection.prepare(statement)); + + ok!(statement.bind(1, None::)); + ok!(statement.bind(2, None::<&str>)); + ok!(statement.bind(3, None::)); + ok!(statement.bind(4, None::<&[u8]>)); + assert_eq!(ok!(statement.next()), State::Done); + + let statement = "INSERT INTO users VALUES (?, ?, ?, ?)"; + let mut statement = ok!(connection.prepare(statement)); + + ok!(statement.bind(1, Some(2i64))); + ok!(statement.bind(2, Some("Bob"))); + ok!(statement.bind(3, Some(69.42))); + ok!(statement.bind(4, Some(&[0x69u8, 0x42u8][..]))); + assert_eq!(ok!(statement.next()), State::Done); +} + #[test] fn statement_count() { let connection = setup_users(":memory:");