openauth-sqlx 0.0.4

SQLx database adapters for OpenAuth.
Documentation
use openauth_core::db::{DbFieldType, DbValue, SqlParam};
use openauth_core::error::OpenAuthError;
use sqlx::sqlite::SqliteArguments;
use sqlx::Arguments;
use time::format_description::well_known::Rfc3339;

use super::errors::{argument_error, json_error, time_error};

pub(super) fn bind_param(
    args: &mut SqliteArguments<'_>,
    param: &SqlParam,
) -> Result<(), OpenAuthError> {
    match &param.value {
        DbValue::String(value) => args.add(value.clone()).map_err(argument_error),
        DbValue::Number(value) => args.add(*value).map_err(argument_error),
        DbValue::Boolean(value) => args.add(i64::from(*value)).map_err(argument_error),
        DbValue::Timestamp(value) => args
            .add(value.format(&Rfc3339).map_err(time_error)?)
            .map_err(argument_error),
        DbValue::Json(value) => args.add(value.to_string()).map_err(argument_error),
        DbValue::StringArray(value) => args
            .add(serde_json::to_string(value).map_err(json_error)?)
            .map_err(argument_error),
        DbValue::NumberArray(value) => args
            .add(serde_json::to_string(value).map_err(json_error)?)
            .map_err(argument_error),
        DbValue::Record(_) | DbValue::RecordArray(_) => Err(OpenAuthError::Adapter(
            "joined records cannot be bound as SQL values".to_owned(),
        )),
        DbValue::Null => match param.field_type {
            DbFieldType::String
            | DbFieldType::Timestamp
            | DbFieldType::Json
            | DbFieldType::StringArray
            | DbFieldType::NumberArray => args.add(Option::<String>::None).map_err(argument_error),
            DbFieldType::Number | DbFieldType::Boolean => {
                args.add(Option::<i64>::None).map_err(argument_error)
            }
        },
    }
}