#![cfg(feature = "macros")]
use hexser::prelude::*;
#[derive(Clone, HexEntity, HexDomain)]
struct User {
id: String,
email: String,
name: String,
}
trait UserRepository: Repository<User> {
fn find_by_email(&self, email: &str) -> HexResult<Option<User>>;
}
#[derive(HexAdapter)]
struct InMemoryUserRepository {
users: Vec<User>,
}
impl Repository<User> for InMemoryUserRepository {
fn save(&mut self, user: User) -> HexResult<()> {
if let Some(existing) = self.users.iter_mut().find(|u| u.id == user.id) {
*existing = user;
} else {
self.users.push(user);
}
Ok(())
}
}
impl UserRepository for InMemoryUserRepository {
fn find_by_email(&self, email: &str) -> HexResult<Option<User>> {
Ok(self.users.iter().find(|u| u.email == email).cloned())
}
}
#[test]
fn readme_quickstart_runs() {
let mut repo = InMemoryUserRepository { users: Vec::new() };
repo
.save(User {
id: String::from("1"),
email: String::from("alice@example.com"),
name: String::from("Alice"),
})
.unwrap();
let found = repo.find_by_email("alice@example.com").unwrap();
assert_eq!(found.map(|u| u.name), Some(String::from("Alice")));
}