use std::convert::TryFrom;
use std::sync::{Arc, Mutex};
use dsf_core::{page::Page, types::Id};
pub use dsf_rpc::data::DataInfo;
use crate::error::Error;
use crate::store::Store;
#[derive(Clone)]
pub struct DataManager {
store: Arc<Mutex<Store>>,
}
pub struct DataInst {
pub info: DataInfo,
pub page: Page,
}
impl From<Page> for DataInst {
fn from(page: Page) -> Self {
let info = DataInfo::try_from(&page).unwrap();
DataInst { info, page }
}
}
impl DataManager {
pub fn new(store: Arc<Mutex<Store>>) -> Self {
Self { store }
}
pub fn fetch_data(&self, service_id: &Id, _limit: usize) -> Result<Vec<DataInst>, Error> {
let store = self.store.lock().unwrap();
let service = match store.find_service(service_id)? {
Some(s) => s,
None => return Err(Error::NotFound),
};
let info: Vec<DataInfo> = store.find_data(service_id)?;
info!("Loaded data info: {:?}", info);
let mut data = Vec::with_capacity(info.len());
for i in info {
info!("Fetching raw page for: {}", i.signature);
let p = store.load_page(&i.signature, Some(service.public_key.clone()))?;
data.push(DataInst {
info: i,
page: p.unwrap(),
})
}
Ok(data)
}
pub fn store_data(&self, info: &DataInfo, page: &Page) -> Result<(), Error> {
let store = self.store.lock().unwrap();
store.save_data(info)?;
store.save_page(page)?;
Ok(())
}
}