use rusqlite::{Connection, Error, functions::FunctionFlags};
use parse_size::Config;
use crate::err;
#[allow(clippy::missing_errors_doc)]
pub fn parse_size(conn: &Connection) -> Result<(), Error> {
conn.create_scalar_function(
"parse_size",
-1, FunctionFlags::SQLITE_UTF8
| FunctionFlags::SQLITE_INNOCUOUS
| FunctionFlags::SQLITE_DETERMINISTIC,
move |ctx| {
let val = ctx.get::<String>(0)?;
let cfg = if ctx.len() > 1 {
let ty = ctx.get::<String>(1)?.to_lowercase();
match ty.as_ref() {
"dec" => Config::new().with_decimal(),
"bin" => Config::new().with_binary(),
_ => {
return Err(Error::UserFunctionError(Box::new(
err::Error::ValidationFailed(String::from("Unknown unit type"))
)));
}
}
} else {
Config::new().with_binary()
};
let val = cfg.parse_size(val).map_err(|e| {
Error::UserFunctionError(Box::new(err::Error::ValidationFailed(
e.to_string()
)))
})?;
Ok(val)
}
)
}