use serde::{Deserialize, Serialize};
use sled::{self, Db};
pub struct AvlonDB {
pub db_name: String,
pub client: Db,
}
impl AvlonDB {
pub fn new(db_name: String) -> Self {
let client = sled::open(&db_name).expect("Failed to open Sled database!");
AvlonDB { db_name, client }
}
pub fn save<T>(&self, key: String, value: T) -> Result<(), Box<dyn std::error::Error>>
where
T: Serialize,
{
let serialized_data = serde_json::to_vec(&value)?;
self.client.insert(key, serialized_data)?;
Ok(())
}
pub fn load<T>(&self, key: &str) -> Result<Option<T>, Box<dyn std::error::Error>>
where
T: for<'de> Deserialize<'de>,
{
if let Some(data) = self.client.get(key)? {
let value: T = serde_json::from_slice(&data)?;
Ok(Some(value))
} else {
Ok(None)
}
}
pub fn load_range<T>(&self, start_key: &str, end_key: &str) -> sled::Result<Vec<T>>
where
T: for<'de> Deserialize<'de>,
{
let mut results = Vec::new();
for result in self.client.range(start_key.as_bytes()..end_key.as_bytes()) {
let (_, value) = result?;
let item: T = serde_json::from_slice(&value).unwrap();
results.push(item);
}
Ok(results)
}
pub fn remove(&self, key: &str) -> Result<(), Box<dyn std::error::Error>> {
self.client.remove(key)?;
Ok(())
}
pub fn update<T>(&self, key: &str, new_value: T) -> Result<(), Box<dyn std::error::Error>>
where
T: Serialize,
{
if self.client.contains_key(key)? {
let serialized_data = serde_json::to_vec(&new_value)?;
self.client.insert(key, serialized_data)?;
Ok(())
} else {
Err(format!("Key '{}' does not exist in the database.", key).into())
}
}
}