use std::{fmt, sync::Arc};
use super::{Dataset, KeyValueStore, RequestQueue, StorageClient, StorageResult};
#[derive(Clone)]
pub struct StorageHandle {
client: Arc<dyn StorageClient>,
dataset: Arc<dyn Dataset>,
key_value_store: Arc<dyn KeyValueStore>,
request_queue: Arc<dyn RequestQueue>,
}
impl StorageHandle {
pub fn new(
client: Arc<dyn StorageClient>,
dataset: Arc<dyn Dataset>,
key_value_store: Arc<dyn KeyValueStore>,
request_queue: Arc<dyn RequestQueue>,
) -> Self {
Self {
client,
dataset,
key_value_store,
request_queue,
}
}
pub fn dataset(&self) -> &Arc<dyn Dataset> {
&self.dataset
}
pub fn key_value_store(&self) -> &Arc<dyn KeyValueStore> {
&self.key_value_store
}
pub fn request_queue(&self) -> &Arc<dyn RequestQueue> {
&self.request_queue
}
pub async fn dataset_named(&self, name: &str) -> StorageResult<Arc<dyn Dataset>> {
self.client.open_dataset(Some(name)).await
}
pub async fn kvs_named(&self, name: &str) -> StorageResult<Arc<dyn KeyValueStore>> {
self.client.open_key_value_store(Some(name)).await
}
pub fn client(&self) -> &Arc<dyn StorageClient> {
&self.client
}
}
impl fmt::Debug for StorageHandle {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("StorageHandle")
.field("client", &"<dyn StorageClient>")
.field("dataset", &"<dyn Dataset>")
.field("key_value_store", &"<dyn KeyValueStore>")
.field("request_queue", &"<dyn RequestQueue>")
.finish()
}
}