use std::any::Any;
use ed25519_dalek::SigningKey;
use crate::{
Result,
entry::{Entry, ID},
};
pub mod database;
pub mod errors;
pub use errors::BackendError;
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, Default,
)]
pub enum VerificationStatus {
#[default]
Verified,
Failed,
}
pub trait BackendImpl: Send + Sync + Any {
fn get(&self, id: &ID) -> Result<Entry>;
fn get_verification_status(&self, id: &ID) -> Result<VerificationStatus>;
fn put(&self, verification_status: VerificationStatus, entry: Entry) -> Result<()>;
fn put_verified(&self, entry: Entry) -> Result<()> {
self.put(VerificationStatus::Verified, entry)
}
fn put_unverified(&self, entry: Entry) -> Result<()> {
self.put(VerificationStatus::Failed, entry)
}
fn update_verification_status(
&self,
id: &ID,
verification_status: VerificationStatus,
) -> Result<()>;
fn get_entries_by_verification_status(&self, status: VerificationStatus) -> Result<Vec<ID>>;
fn get_tips(&self, tree: &ID) -> Result<Vec<ID>>;
fn get_store_tips(&self, tree: &ID, store: &str) -> Result<Vec<ID>>;
fn get_store_tips_up_to_entries(
&self,
tree: &ID,
store: &str,
main_entries: &[ID],
) -> Result<Vec<ID>>;
fn all_roots(&self) -> Result<Vec<ID>>;
fn find_lca(&self, tree: &ID, store: &str, entry_ids: &[ID]) -> Result<ID>;
fn collect_root_to_target(&self, tree: &ID, store: &str, target_entry: &ID) -> Result<Vec<ID>>;
fn as_any(&self) -> &dyn Any;
fn get_tree(&self, tree: &ID) -> Result<Vec<Entry>>;
fn get_store(&self, tree: &ID, store: &str) -> Result<Vec<Entry>>;
fn get_tree_from_tips(&self, tree: &ID, tips: &[ID]) -> Result<Vec<Entry>>;
fn get_store_from_tips(&self, tree: &ID, store: &str, tips: &[ID]) -> Result<Vec<Entry>>;
fn store_private_key(&self, key_name: &str, private_key: SigningKey) -> Result<()>;
fn get_private_key(&self, key_name: &str) -> Result<Option<SigningKey>>;
fn list_private_keys(&self) -> Result<Vec<String>>;
fn remove_private_key(&self, key_name: &str) -> Result<()>;
fn get_cached_crdt_state(&self, entry_id: &ID, store: &str) -> Result<Option<String>>;
fn cache_crdt_state(&self, entry_id: &ID, store: &str, state: String) -> Result<()>;
fn clear_crdt_cache(&self) -> Result<()>;
fn get_sorted_store_parents(&self, tree_id: &ID, entry_id: &ID, store: &str)
-> Result<Vec<ID>>;
fn get_path_from_to(
&self,
tree_id: &ID,
store: &str,
from_id: &ID,
to_ids: &[ID],
) -> Result<Vec<ID>>;
}