Files
2026-07-13 12:42:18 +08:00

70 lines
1.4 KiB
Rust

use std::collections::HashMap;
pub trait Repository {
fn find_by_id(&self, id: u64) -> Option<&User>;
fn save(&mut self, user: User);
}
#[derive(Debug, Clone)]
pub struct User {
pub id: u64,
pub name: String,
pub email: String,
}
pub struct InMemoryRepo {
users: HashMap<u64, User>,
}
impl InMemoryRepo {
pub fn new() -> Self {
InMemoryRepo {
users: HashMap::new(),
}
}
}
impl Repository for InMemoryRepo {
fn find_by_id(&self, id: u64) -> Option<&User> {
self.users.get(&id)
}
fn save(&mut self, user: User) {
println!("Saving user {}", user.id);
self.users.insert(user.id, user);
}
}
pub fn create_user(repo: &mut impl Repository, name: &str, email: &str) -> User {
let user = User {
id: 1,
name: name.to_string(),
email: email.to_string(),
};
repo.save(user.clone());
user
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_repo_is_empty() {
let repo = InMemoryRepo::new();
assert!(repo.find_by_id(1).is_none());
}
#[test]
fn create_user_saves_to_repo() {
let mut repo = InMemoryRepo::new();
let user = create_user(&mut repo, "alice", "a@b.c");
assert_eq!(user.name, "alice");
}
#[tokio::test]
async fn async_test_is_detected() {
assert!(true);
}
}