sqlite-functions 0.1.1

A small toolkit for authoring Rust functions for SQLite
Documentation
use std::panic::{RefUnwindSafe, UnwindSafe};

use rusqlite::functions::{Aggregate, Context, SqlFnOutput};
use rusqlite::{Connection, Result};

use crate::FunctionOptions;

/// Register a scalar callback on one SQLite connection.
///
/// Registration belongs to the connection and lasts until it is closed or the
/// function is explicitly removed.
pub fn register_scalar<F, T>(
    connection: &Connection,
    options: FunctionOptions,
    callback: F,
) -> Result<()>
where
    F: Fn(&Context<'_>) -> Result<T> + Send + 'static,
    T: SqlFnOutput,
{
    let (name, arity, flags) = options.into_parts();
    connection.create_scalar_function(name.as_str(), arity, flags, callback)
}

/// Register a stateful aggregate callback on one SQLite connection.
pub fn register_aggregate<A, D, T>(
    connection: &Connection,
    options: FunctionOptions,
    aggregate: D,
) -> Result<()>
where
    A: RefUnwindSafe + UnwindSafe,
    D: Aggregate<A, T> + 'static,
    T: SqlFnOutput,
{
    let (name, arity, flags) = options.into_parts();
    connection.create_aggregate_function(name.as_str(), arity, flags, aggregate)
}