use serde::{Deserialize, Serialize};
use std::ops::Deref;
use time::OffsetDateTime;
#[derive(Serialize, Deserialize, Debug)]
pub struct Commit {
pub summary: String,
pub message: String,
pub author: Author,
pub committer: Author,
pub hash: Vec<u8>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Author {
pub name: String,
pub email: String,
pub time: OffsetDateTime,
}
impl Commit {
pub fn insert(&self, database: &CommitTree, id: usize) {
database
.insert(id.to_be_bytes(), bincode::serialize(self).unwrap())
.unwrap();
}
}
pub struct CommitTree(sled::Tree);
impl Deref for CommitTree {
type Target = sled::Tree;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl CommitTree {
pub(super) fn new(tree: sled::Tree) -> Self {
Self(tree)
}
pub fn fetch_latest(&self, amount: usize, offset: usize) -> Vec<Commit> {
let (latest_key, _) = self.last().unwrap().unwrap();
let mut latest_key_bytes = [0; std::mem::size_of::<usize>()];
latest_key_bytes.copy_from_slice(&latest_key);
let end = usize::from_be_bytes(latest_key_bytes).saturating_sub(offset);
let start = end.saturating_sub(amount);
self.range(start.to_be_bytes()..end.to_be_bytes())
.rev()
.map(|res| {
let (_, value) = res?;
let details = bincode::deserialize(&value).unwrap();
Ok(details)
})
.collect::<Result<Vec<_>, sled::Error>>()
.unwrap()
}
}