I have a struct with there in a snapshot of a piece of dastabase. Now I want to make different indexes on it so that I can quickly find an object. How do I do that?
I have tried below but I can't figure it out with the lifetimes.
use std::collections::HashMap;
struct User {
id: u32,
name: String,
}
struct Home {
id: u32,
name: String,
user_id: u32,
}
struct DbViewBuilder {
pub users: Vec<User>,
pub home: Vec<Home>,
}
impl DbViewBuilder {
fn build<'a>(self) -> DbView<'a> {
DbView {
users: self.users,
home: self.home,
user_by_user_id: self
.users
.iter()
.map(|s| (s.id, s))
.collect::<HashMap<u32, &'a User>>(),
home_by_home_id: HashMap::new(),
homes_by_user_id: HashMap::new(),
}
}
}
struct DbView<'a> {
users: Vec<User>,
home: Vec<Home>,
user_by_user_id: HashMap<u32, &'a User>,
home_by_home_id: HashMap<u32, &'a Home>,
homes_by_user_id: HashMap<u32, Vec<&'a Home>>,
}
impl<'a> DbView<'a> {
// fn index(&mut self) {
// self.user_by_user_id = self
// .users
// .iter()
// .map(|s| (s.id, s))
// .collect::<HashMap<u32, &'a User>>();
// }
fn get_user_by_id(&self, id: &u32) -> Option<&&User> {
self.user_by_user_id.get(id)
}
fn get_homes_by_user_id(&self, id: &u32) -> Option<&Vec<&Home>> {
self.homes_by_user_id.get(id)
}
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn it_works() {
let view = DbViewBuilder {
user: vec![User {id: 32, name:"test_user".to_string()}],
home: vec![],
}.build();
}
}
Errors:
Compiling playground v0.0.1 (/playground)
error[E0560]: struct `DbViewBuilder` has no field named `user`
--> src/lib.rs:69:13
|
69 | user: vec![User {id: 32, name:"test_user".to_string()}],
| ^^^^ help: a field with a similar name exists: `users`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0560`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error[E0597]: `self.users` does not live long enough
--> src/lib.rs:24:30
|
20 | fn build<'a>(self) -> DbView<'a> {
| -- lifetime `'a` defined here
...
24 | user_by_user_id: self
| ______________________________^
25 | | .users
| |______________________^ borrowed value does not live long enough
26 | .iter()
27 | .map(|s| (s.id, s))
| --------- returning this value requires that `self.users` is borrowed for `'a`
...
32 | }
| - `self.users` dropped here while still borrowed
error[E0382]: borrow of moved value: `self.users`
--> src/lib.rs:24:30
|
22 | users: self.users,
| ---------- value moved here
23 | home: self.home,
24 | user_by_user_id: self
| ______________________________^
25 | | .users
26 | | .iter()
| |_______________________^ value borrowed here after move
|
= note: move occurs because `self.users` has type `Vec<User>`, which does not implement the `Copy` trait
= note: borrow occurs due to deref coercion to `[User]`
note: deref defined here
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0382, E0597.
For more information about an error, try `rustc --explain E0382`.
error: build failed