pub mod from_row;
pub mod keyed;
pub mod tree_identity;
pub mod tree_index;
pub mod tree_insert;
pub mod tree_merge;
pub mod tree_predicate;
pub mod tree_update;
use crate::error::ToqlError;
use crate::keyed::Keyed;
use std::boxed::Box;
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_feature",
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(feature = "serde_feature", serde(untagged))]
pub enum Join<E: Keyed> {
Entity(Box<E>),
Key(E::Key),
}
impl<E> Default for Join<E>
where
E: Default + Keyed,
{
fn default() -> Self {
Join::Entity(Box::new(E::default()))
}
}
impl<E> Clone for Join<E>
where
E: Clone + Keyed,
<E as Keyed>::Key: Clone,
{
fn clone(&self) -> Self {
match self {
Join::Key(k) => Join::Key(k.clone()),
Join::Entity(e) => Join::Entity(e.clone()),
}
}
}
impl<T> Join<T>
where
T: Keyed,
{
pub fn with_entity(entity: T) -> Self {
Join::Entity(Box::new(entity))
}
pub fn with_key(key: impl Into<<T as Keyed>::Key>) -> Self {
Join::Key(key.into())
}
pub fn entity(&self) -> Option<&T> {
match self {
Join::Key(_) => None,
Join::Entity(e) => Some(&e),
}
}
pub fn entity_mut(&mut self) -> Option<&mut T> {
match self {
Join::Key(_) => None,
Join::Entity(e) => Some(e.as_mut()),
}
}
pub fn entity_or_err<E>(&self, err: E) -> std::result::Result<&T, E> {
match self {
Join::Key(_) => Err(err),
Join::Entity(e) => Ok(&e),
}
}
pub fn entity_mut_or_err<E>(&mut self, err: E) -> std::result::Result<&mut T, E> {
match self {
Join::Key(_) => Err(err),
Join::Entity(e) => Ok(e.as_mut()),
}
}
pub fn key(&self) -> <T as Keyed>::Key
where
<T as Keyed>::Key: std::clone::Clone,
{
match self {
Join::Entity(e) => e.key(),
Join::Key(k) => k.to_owned(),
}
}
pub fn into_entity(self) -> std::result::Result<T, ToqlError> {
match self {
Join::Key(_) => Err(ToqlError::NotFound),
Join::Entity(e) => Ok(*e),
}
}
}
#[cfg(test)]
mod test {
use super::Join;
use crate::error::ToqlError;
use crate::key::Key;
use crate::keyed::Keyed;
use crate::sql_arg::SqlArg;
#[test]
fn build() {
#[derive(Debug, Clone, PartialEq)]
struct User {
id: u64,
name: String,
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
struct UserKey {
id: u64,
}
impl Keyed for User {
type Key = UserKey;
fn key(&self) -> Self::Key {
UserKey { id: self.id }
}
}
impl Key for UserKey {
type Entity = User;
fn columns() -> Vec<String> {
vec!["id".to_string()]
}
fn default_inverse_columns() -> Vec<String> {
vec!["user_id".to_string()]
}
fn params(&self) -> Vec<SqlArg> {
vec![SqlArg::U64(self.id)]
}
}
impl Default for User {
fn default() -> Self {
User {
id: 0,
name: "new_user".to_string(),
}
}
}
let mut u = User {
id: 1,
name: "user1".to_string(),
};
let mut j = Join::with_entity(u.clone());
assert_eq!(j.entity(), Some(&u));
assert_eq!(j.entity_mut(), Some(&mut u));
assert!(j
.entity_or_err(ToqlError::NoneError("expected entity".to_string()))
.is_ok());
assert!(j
.entity_mut_or_err(ToqlError::NoneError("expected entity".to_string()))
.is_ok());
assert_eq!(j.key(), u.key());
assert!(j.into_entity().is_ok());
let j: Join<User> = Join::with_key(u.key());
let mut j = j.clone();
assert_eq!(j.entity(), None);
assert_eq!(j.entity_mut(), None);
assert!(j
.entity_or_err(ToqlError::NoneError("expected entity".to_string()))
.is_err());
assert!(j
.entity_mut_or_err(ToqlError::NoneError("expected entity".to_string()))
.is_err());
assert_eq!(j.key(), u.key());
assert!(j.into_entity().is_err());
let j = Join::default();
let u = User::default();
assert_eq!(j.entity(), Some(&u));
let j = User::default().key();
assert_eq!(UserKey::columns(), vec!["id".to_string()]);
assert_eq!(
UserKey::default_inverse_columns(),
vec!["user_id".to_string()]
);
assert_eq!(j.params(), vec![SqlArg::U64(0)]);
}
}