use crate::{ZephyrMock, ZephyrStandard};
use anyhow::Result;
use rs_zephyr_common::DatabaseError;
pub enum WhereCond {
ColEq(i64),
ColGt(i64),
ColLt(i64),
}
impl WhereCond {
pub(crate) fn from_column_and_operator(col: i64, operator: i64) -> Result<Self> {
match operator {
0 => Ok(Self::ColEq(col)),
1 => Ok(Self::ColGt(col)),
2 => Ok(Self::ColLt(col)),
_ => Err(DatabaseError::OperatorError.into()),
}
}
}
pub trait ZephyrDatabase {
fn read_raw(
&self,
user_id: i64,
read_point_hash: [u8; 16],
read_data: &[i64],
condition: Option<&[WhereCond]>,
condition_args: Option<Vec<Vec<u8>>>,
) -> Result<Vec<u8>, DatabaseError>;
fn write_raw(
&self,
user_id: i64,
written_point_hash: [u8; 16],
write_data: &[i64],
written: Vec<Vec<u8>>,
) -> Result<(), DatabaseError>;
fn update_raw(
&self,
user_id: i64,
written_point_hash: [u8; 16],
write_data: &[i64],
written: Vec<Vec<u8>>,
condition: &[WhereCond],
condition_args: Vec<Vec<u8>>,
) -> Result<(), DatabaseError>;
}
#[derive(Clone)]
pub enum DatabasePermissions {
ReadOnly,
WriteOnly,
ReadWrite,
}
#[derive(Clone)]
pub struct DatabaseImpl<DB: ZephyrDatabase> {
pub permissions: DatabasePermissions,
pub db: Box<DB>,
}
#[derive(Clone)]
pub struct Database<DB: ZephyrDatabase>(pub(crate) DatabaseImpl<DB>);
impl<DB: ZephyrDatabase + ZephyrStandard> ZephyrStandard for DatabaseImpl<DB> {
fn zephyr_standard() -> Result<Self> {
Ok(Self {
permissions: DatabasePermissions::ReadWrite,
db: Box::new(DB::zephyr_standard()?),
})
}
}
impl<DB: ZephyrDatabase + ZephyrStandard> ZephyrStandard for Database<DB> {
fn zephyr_standard() -> Result<Self> {
Ok(Self(DatabaseImpl::zephyr_standard()?))
}
}
impl<DB: ZephyrDatabase + ZephyrMock> ZephyrMock for DatabaseImpl<DB> {
fn mocked() -> Result<Self> {
Ok(Self {
permissions: DatabasePermissions::ReadWrite,
db: Box::new(DB::mocked()?),
})
}
}
impl<DB: ZephyrDatabase + ZephyrMock> ZephyrMock for Database<DB> {
fn mocked() -> Result<Self> {
Ok(Self(DatabaseImpl::mocked()?))
}
}