storage-kit 0.0.1

Portable database and transactional state-store Kit.
Documentation
use crate::{
    CapabilitySet, CatalogRequest, CatalogResponse, CommonConfig, DataRequest, DataResponse,
    DatabaseBackend, IndexRequest, IndexResponse, QueryRequest, QueryResponse, StorageError,
    SurrealConfig,
};

use super::manager::SurrealManager;

#[derive(Clone, Debug)]
pub(crate) struct SurrealBackend {
    manager: Box<SurrealManager>,
}

impl SurrealBackend {
    pub(crate) async fn connect(
        common: CommonConfig,
        config: SurrealConfig,
    ) -> Result<Self, StorageError> {
        SurrealManager::connect(common, config)
            .await
            .map(|manager| Self {
                manager: Box::new(manager),
            })
    }
}

impl DatabaseBackend for SurrealBackend {
    fn capabilities(&self) -> CapabilitySet {
        self.manager.capabilities()
    }

    async fn catalog(&self, req: CatalogRequest) -> Result<CatalogResponse, StorageError> {
        let manager = self.manager.as_ref();
        let req = manager.normalize_request(req);
        manager.catalog(req).await
    }

    async fn data(&self, req: DataRequest) -> Result<DataResponse, StorageError> {
        let manager = self.manager.as_ref();
        let req = manager.normalize_request(req);
        req.validate()?;
        manager.data(req).await
    }

    async fn query(&self, req: QueryRequest) -> Result<QueryResponse, StorageError> {
        let manager = self.manager.as_ref();
        let req = manager.normalize_request(req);
        manager.query(req).await
    }

    async fn index(&self, req: IndexRequest) -> Result<IndexResponse, StorageError> {
        let manager = self.manager.as_ref();
        let req = manager.normalize_request(req);
        manager.index(req).await
    }
}