use rusqlite::functions::FunctionFlags;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Arity {
Exact(u16),
Variadic,
}
impl Arity {
pub(crate) const fn as_sqlite(self) -> i32 {
match self {
Self::Exact(value) => value as i32,
Self::Variadic => -1,
}
}
}
#[derive(Clone, Debug)]
pub struct FunctionOptions {
name: String,
arity: Arity,
flags: FunctionFlags,
}
impl FunctionOptions {
#[must_use]
pub fn new(name: impl Into<String>, arity: Arity) -> Self {
Self {
name: name.into(),
arity,
flags: FunctionFlags::SQLITE_UTF8,
}
}
#[must_use]
pub fn deterministic(mut self) -> Self {
self.flags |= FunctionFlags::SQLITE_DETERMINISTIC;
self
}
#[must_use]
pub fn innocuous(mut self) -> Self {
self.flags |= FunctionFlags::SQLITE_INNOCUOUS;
self
}
#[must_use]
pub fn direct_only(mut self) -> Self {
self.flags |= FunctionFlags::SQLITE_DIRECTONLY;
self
}
#[must_use]
pub fn with_flags(mut self, flags: FunctionFlags) -> Self {
self.flags |= flags;
self
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub const fn arity(&self) -> Arity {
self.arity
}
#[must_use]
pub const fn flags(&self) -> FunctionFlags {
self.flags
}
pub(crate) fn into_parts(self) -> (String, i32, FunctionFlags) {
(self.name, self.arity.as_sqlite(), self.flags)
}
}