use bincode::Decode;
#[cfg(feature = "redb")]
use redb::{Key, Value};
use strum::IntoDiscriminant;
use crate::definition::NetabaseDefinitionTrait;
use crate::{MaybeSend, MaybeSync};
#[cfg(not(feature = "redb"))]
pub trait NetabaseModelTrait<D: NetabaseDefinitionTrait>:
bincode::Encode + bincode::Decode<()> + Sized + Clone + MaybeSend + MaybeSync + 'static
where
<D as IntoDiscriminant>::Discriminant: crate::traits::definition::NetabaseDiscriminant,
<<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant:
crate::traits::definition::NetabaseKeyDiscriminant,
{
const DISCRIMINANT: <D as IntoDiscriminant>::Discriminant;
type Keys: NetabaseModelTraitKey<D, PrimaryKey = Self::PrimaryKey, SecondaryKey = Self::SecondaryKeys>
+ From<Self::PrimaryKey>
+ From<Self::SecondaryKeys>;
type PrimaryKey: bincode::Encode + Decode<()> + Clone + Ord;
type SecondaryKeys: bincode::Encode + Decode<()> + Clone + Ord + IntoDiscriminant;
fn key(&self) -> Self::Keys;
fn primary_key(&self) -> Self::PrimaryKey;
fn secondary_keys(
&self,
) -> std::collections::HashMap<
<Self::SecondaryKeys as IntoDiscriminant>::Discriminant,
Self::SecondaryKeys,
>
where
Self::SecondaryKeys: IntoDiscriminant;
fn has_secondary(&self) -> bool;
fn discriminant_name() -> &'static str;
}
#[cfg(feature = "redb")]
pub trait NetabaseModelTrait<D: NetabaseDefinitionTrait>:
bincode::Encode + bincode::Decode<()> + Sized + Clone + MaybeSend + MaybeSync + 'static
where
for<'a> Self: std::borrow::Borrow<<Self as Value>::SelfType<'a>>,
for<'a> Self: Value<SelfType<'a> = Self::BorrowedType<'a>>,
<D as IntoDiscriminant>::Discriminant: crate::traits::definition::NetabaseDiscriminant,
<<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant:
crate::traits::definition::NetabaseKeyDiscriminant,
{
const DISCRIMINANT: <D as IntoDiscriminant>::Discriminant;
type BorrowedType<'a>;
type Keys: NetabaseModelTraitKey<D, PrimaryKey = Self::PrimaryKey, SecondaryKey = Self::SecondaryKeys>
+ From<Self::PrimaryKey>
+ From<Self::SecondaryKeys>;
type PrimaryKey: InnerKey + bincode::Encode + Decode<()> + Clone + Ord;
type SecondaryKeys: InnerKey + bincode::Encode + Decode<()> + Clone + Ord + IntoDiscriminant;
fn key(&self) -> Self::Keys;
fn primary_key(&self) -> Self::PrimaryKey;
fn secondary_keys(
&self,
) -> std::collections::HashMap<
<Self::SecondaryKeys as IntoDiscriminant>::Discriminant,
Self::SecondaryKeys,
>
where
Self::SecondaryKeys: IntoDiscriminant;
fn has_secondary(&self) -> bool;
fn discriminant_name() -> &'static str;
}
#[cfg(not(feature = "redb"))]
pub trait NetabaseModelTraitKey<D: NetabaseDefinitionTrait>:
bincode::Encode + Decode<()> + std::fmt::Debug + Clone + MaybeSend + MaybeSync + 'static + Ord
where
<D as IntoDiscriminant>::Discriminant: crate::traits::definition::NetabaseDiscriminant,
<<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant:
crate::traits::definition::NetabaseKeyDiscriminant,
{
const DISCRIMINANT: <<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant;
type PrimaryKey: bincode::Encode + Decode<()> + Clone + Ord;
type SecondaryKey: bincode::Encode + Decode<()> + Clone + Ord + IntoDiscriminant;
}
#[cfg(feature = "redb")]
pub trait NetabaseModelTraitKey<D: NetabaseDefinitionTrait>:
bincode::Encode
+ Decode<()>
+ std::fmt::Debug
+ Clone
+ MaybeSend
+ MaybeSync
+ 'static
+ Ord
+ redb::Key
+ redb::Value
where
<D as IntoDiscriminant>::Discriminant: crate::traits::definition::NetabaseDiscriminant,
<<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant:
crate::traits::definition::NetabaseKeyDiscriminant,
Self: Key,
for<'a> Self: std::borrow::Borrow<<Self as redb::Value>::SelfType<'a>>,
{
const DISCRIMINANT: <<D as NetabaseDefinitionTrait>::Keys as IntoDiscriminant>::Discriminant;
type PrimaryKey: InnerKey + bincode::Encode + Decode<()> + Clone + Ord;
type SecondaryKey: InnerKey + bincode::Encode + Decode<()> + Clone + Ord + IntoDiscriminant;
}
#[cfg(feature = "redb")]
pub trait InnerKey: Key + Value
where
for<'a> Self: std::borrow::Borrow<<Self as Value>::SelfType<'a>>,
{
}
#[cfg(not(feature = "redb"))]
pub trait InnerKey: bincode::Encode + Decode<()> + Clone + Ord {
}