Struct ddd_rs::infrastructure::memory::InMemoryRepository
source · pub struct InMemoryRepository<T: AggregateRoot> { /* private fields */ }Expand description
An in-memory implementation of Repository, using a HashMap.
Examples
use ddd_rs::application::{ReadRepository, Repository};
use ddd_rs::infrastructure::InMemoryRepository;
// By definition, only `AggregateRoot`s have repositories.
//
// Common entities must be retrieved and persisted through their associated aggregate roots.
#[derive(ddd_rs::AggregateRoot, ddd_rs::Entity, Clone)]
struct MyEntity {
#[entity(id)]
id: u32,
my_field: String,
}
impl MyEntity {
pub fn new(id: u32, my_field: impl ToString) -> Self {
Self {
id,
my_field: my_field.to_string(),
}
}
}
let repository: InMemoryRepository<MyEntity> = InMemoryRepository::new();
// Add some entities to the repository.
repository.add(MyEntity::new(1, "foo")).await.unwrap();
repository.add(MyEntity::new(2, "bar")).await.unwrap();
repository.add(MyEntity::new(3, "baz")).await.unwrap();
// Attempt to retrieve an entity by its ID.
let my_entity_2 = repository.get_by_id(2).await.unwrap();
assert!(my_entity_2.is_some());
assert_eq!(my_entity_2.as_ref().map(|e| e.my_field.as_str()), Some("bar"));
let mut my_entity_2 = my_entity_2.unwrap();
// Update the entity, then persist its changes.
my_entity_2.my_field = "qux".to_string();
let my_entity_2 = repository.update(my_entity_2).await.unwrap();
assert_eq!(my_entity_2.my_field.as_str(), "qux");
// Delete the entity permanently.
repository.delete(my_entity_2).await.unwrap();
// Assert it no longer exists.
assert!(!repository.exists(2).await.unwrap());Implementations§
source§impl<T: AggregateRoot> InMemoryRepository<T>
impl<T: AggregateRoot> InMemoryRepository<T>
sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new InMemoryRepository.
Trait Implementations§
source§impl<T: AggregateRoot> Default for InMemoryRepository<T>
impl<T: AggregateRoot> Default for InMemoryRepository<T>
source§impl<T: AggregateRoot + Clone> ReadRepository<T> for InMemoryRepository<T>where
<T as Entity>::Id: Hash + Eq,
impl<T: AggregateRoot + Clone> ReadRepository<T> for InMemoryRepository<T>where <T as Entity>::Id: Hash + Eq,
source§fn get_by_id<'life0, 'async_trait>(
&'life0 self,
id: <T as Entity>::Id
) -> Pin<Box<dyn Future<Output = Result<Option<T>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_by_id<'life0, 'async_trait>( &'life0 self, id: <T as Entity>::Id ) -> Pin<Box<dyn Future<Output = Result<Option<T>>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Gets an entity with the given ID.
source§fn list<'life0, 'async_trait>(
&'life0 self,
skip: usize,
take: usize
) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list<'life0, 'async_trait>( &'life0 self, skip: usize, take: usize ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Lists all entities within a given page.
source§fn count<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count<'life0, 'async_trait>( &'life0 self ) -> Pin<Box<dyn Future<Output = Result<usize>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Returns the total number of entities in the repository.
source§impl<T: AggregateRoot + Clone> Repository<T> for InMemoryRepository<T>where
<T as Entity>::Id: Hash + Eq,
impl<T: AggregateRoot + Clone> Repository<T> for InMemoryRepository<T>where <T as Entity>::Id: Hash + Eq,
source§fn add<'life0, 'async_trait>(
&'life0 self,
entity: T
) -> Pin<Box<dyn Future<Output = Result<T>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add<'life0, 'async_trait>( &'life0 self, entity: T ) -> Pin<Box<dyn Future<Output = Result<T>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Adds an entity to the repository.
source§fn update<'life0, 'async_trait>(
&'life0 self,
entity: T
) -> Pin<Box<dyn Future<Output = Result<T>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update<'life0, 'async_trait>( &'life0 self, entity: T ) -> Pin<Box<dyn Future<Output = Result<T>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Updates an entity on the repository.
source§fn delete<'life0, 'async_trait>(
&'life0 self,
entity: T
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn delete<'life0, 'async_trait>( &'life0 self, entity: T ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Deletes the entity from the repository.
source§fn add_range<'life0, 'async_trait>(
&'life0 self,
entities: Vec<T>
) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + Send + 'async_trait>>where
Self: Sync + 'async_trait,
'life0: 'async_trait,
fn add_range<'life0, 'async_trait>( &'life0 self, entities: Vec<T> ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + Send + 'async_trait>>where Self: Sync + 'async_trait, 'life0: 'async_trait,
Adds the given entities to the repository.
Auto Trait Implementations§
impl<T> RefUnwindSafe for InMemoryRepository<T>
impl<T> Send for InMemoryRepository<T>
impl<T> Sync for InMemoryRepository<T>
impl<T> Unpin for InMemoryRepository<T>where T: Unpin, <T as Entity>::Id: Unpin,
impl<T> UnwindSafe for InMemoryRepository<T>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more