use rusqlite::Connection;
use rusqlite::functions::FunctionFlags;
pub fn register(conn: &Connection) -> rusqlite::Result<()> {
conn.create_scalar_function(
"fhir_last_segment",
1,
FunctionFlags::SQLITE_UTF8 | FunctionFlags::SQLITE_DETERMINISTIC,
|ctx| {
let arg = ctx.get_raw(0);
let s = match arg {
rusqlite::types::ValueRef::Null => return Ok(None::<String>),
rusqlite::types::ValueRef::Text(t) => std::str::from_utf8(t)
.map_err(|e| rusqlite::Error::UserFunctionError(Box::new(e)))?,
_ => {
return Err(rusqlite::Error::UserFunctionError(
"fhir_last_segment expects a text argument".into(),
));
}
};
Ok(Some(match s.rfind('/') {
Some(idx) => s[idx + 1..].to_string(),
None => s.to_string(),
}))
},
)?;
Ok(())
}