sqlite3_ext 0.2.1

Build loadable extensions for SQLite using Rust
Documentation
use crate::test_vtab::*;
use sqlite3_ext::{function::*, *};
use std::cell::Cell;

#[test]
fn find_function() -> Result<()> {
    #[derive(Default)]
    struct Hooks {
        pub was_called: Cell<bool>,
    }

    impl TestHooks for Hooks {
        fn connect_create<'a>(&'a self, vtab: &mut TestVTab<'a, Self>) {
            vtab.functions.add(1, "overloaded_func", None, |c, _| {
                self.was_called.set(true);
                c.set_result(true)
            });

            vtab.functions
                .add(1, "passthrough", None, |c, a| c.set_result(&*a[0]));

            vtab.functions
                .add_method(1, "passthrough_method", None, |_, c, a| {
                    c.set_result(&*a[0])
                });
        }
    }

    let hooks = Hooks::default();
    let conn = setup(&hooks)?;
    conn.create_overloaded_function("overloaded_func", &FunctionOptions::default().set_n_args(1))?;
    conn.query_row(
        "SELECT a FROM tbl WHERE overloaded_func(a) LIMIT 1",
        (),
        |_| Ok(()),
    )?;

    assert!(hooks.was_called.get(), "overloaded_func was not called");
    Ok(())
}