lila-chat/src/file_io.rs

56 lines
1.7 KiB
Rust

extern crate log;
use crate::user::User;
type MyErrorType = Box<dyn std::error::Error>;
// add a user to the database
pub fn db_add(user: &User) {
let db: sled::Db = sled::open("users_db").unwrap();
let bytes = bincode::serialize(&user).unwrap();
db.insert(&user.name, bytes).unwrap();
info!("succesfully appended user {} to database", &user.name);
}
// write all changed users to database
pub fn db_write(users_list: &Vec<User>) {
let db: sled::Db = sled::open("users_db").unwrap();
for i in users_list {
let bytes = bincode::serialize(&i).unwrap();
db.insert(&i.name, bytes).unwrap();
info!("wrote user {} to db", &i.name);
}
info!("wrote all users to db");
}
// remove a user from the database
pub fn db_remove(user: &User) {
let db: sled::Db = sled::open("users_db").unwrap();
db.remove(&user.name);
}
// read all users from the database
pub fn db_read() -> Vec<User> {
let db: sled::Db = sled::open("users_db").unwrap();
let mut users: Vec<User> = Vec::new();
for (_, bytes) in db.iter().filter_map(|r| r.ok()) {
let read_user: User = bincode::deserialize(&bytes).unwrap();
info!("read user {} from db", read_user.name);
users.push(read_user);
}
return users;
}
// read one user from the database
pub fn db_read_user(user: &str) -> std::result::Result<Option<User>, MyErrorType> {
let db: sled::Db = sled::open("users_db")?;
let entry = db.get(user)?;
if let Some(user_entry) = entry {
let read_user: User = bincode::deserialize(&user_entry)?;
info!("read user {} from db", read_user.name);
Ok(Some(read_user))
} else {
warn!("user {} not found in db!", user);
Ok(None)
}
}