burncloud-database-impl 0.1.0

Database implementations for multiple backends (PostgreSQL, MySQL, SQLite, MongoDB) for BurnCloud
Documentation
use burncloud_database_core::{QueryParam};
use burncloud_database_core::error::DatabaseError;

#[derive(Debug, Clone)]
pub struct StringParam(pub String);
#[derive(Debug, Clone)]
pub struct I64Param(pub i64);
#[derive(Debug, Clone)]
pub struct F64Param(pub f64);
#[derive(Debug, Clone)]
pub struct BoolParam(pub bool);
#[derive(Debug, Clone)]
pub struct BytesParam(pub Vec<u8>);

impl QueryParam for StringParam {
    fn as_string(&self) -> String {
        self.0.clone()
    }

    fn as_i64(&self) -> Option<i64> {
        self.0.parse().ok()
    }

    fn as_f64(&self) -> Option<f64> {
        self.0.parse().ok()
    }

    fn as_bool(&self) -> Option<bool> {
        self.0.parse().ok()
    }

    fn as_bytes(&self) -> Option<&[u8]> {
        Some(self.0.as_bytes())
    }
}

impl QueryParam for I64Param {
    fn as_string(&self) -> String {
        self.0.to_string()
    }

    fn as_i64(&self) -> Option<i64> {
        Some(self.0)
    }

    fn as_f64(&self) -> Option<f64> {
        Some(self.0 as f64)
    }

    fn as_bool(&self) -> Option<bool> {
        Some(self.0 != 0)
    }

    fn as_bytes(&self) -> Option<&[u8]> {
        None
    }
}

impl QueryParam for F64Param {
    fn as_string(&self) -> String {
        self.0.to_string()
    }

    fn as_i64(&self) -> Option<i64> {
        Some(self.0 as i64)
    }

    fn as_f64(&self) -> Option<f64> {
        Some(self.0)
    }

    fn as_bool(&self) -> Option<bool> {
        Some(self.0 != 0.0)
    }

    fn as_bytes(&self) -> Option<&[u8]> {
        None
    }
}

impl QueryParam for BoolParam {
    fn as_string(&self) -> String {
        self.0.to_string()
    }

    fn as_i64(&self) -> Option<i64> {
        Some(if self.0 { 1 } else { 0 })
    }

    fn as_f64(&self) -> Option<f64> {
        Some(if self.0 { 1.0 } else { 0.0 })
    }

    fn as_bool(&self) -> Option<bool> {
        Some(self.0)
    }

    fn as_bytes(&self) -> Option<&[u8]> {
        None
    }
}

impl QueryParam for BytesParam {
    fn as_string(&self) -> String {
        String::from_utf8_lossy(&self.0).to_string()
    }

    fn as_i64(&self) -> Option<i64> {
        None
    }

    fn as_f64(&self) -> Option<f64> {
        None
    }

    fn as_bool(&self) -> Option<bool> {
        None
    }

    fn as_bytes(&self) -> Option<&[u8]> {
        Some(&self.0)
    }
}

pub fn map_database_error(error: Box<dyn std::error::Error + Send + Sync>) -> DatabaseError {
    DatabaseError::InternalError(error.to_string())
}