datasources 0.1.5

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use crate::command_middleware::CommandMiddleware;
use crate::connection::Connection;
use crate::native::Native;
use crate::parameter::Parameter;
use crate::reader::Reader;
use crate::response::Response;
use crate::result::Result;
use crate::statement::Statement;
use crate::statement_parser::StatementParser;
use async_trait::async_trait;
use std::sync::Arc;

#[async_trait]
pub trait Command: Send + Sync {
    fn connection(&self) -> Arc<dyn Connection>;
    fn add_middleware(&self, middleware: Arc<dyn CommandMiddleware>);
    async fn execute_reader_native(
        &self,
        text: &Native,
        parameters: Option<&[Parameter]>,
    ) -> Result<Box<dyn Reader>>;
    async fn execute_native(
        &self,
        text: &Native,
        parameters: Option<&[Parameter]>,
    ) -> Result<Response>;
    async fn execute_reader(
        &self,
        text: &str,
        parameters: Option<&[Parameter]>,
    ) -> Result<Box<dyn Reader>> {
        if text.trim().is_empty() {
            return Err(crate::DatasourceError::message("empty command"));
        }
        let statement = StatementParser::parse(text)?;
        self.execute_reader_statement(statement.as_ref(), parameters)
            .await
    }
    async fn execute(&self, text: &str, parameters: Option<&[Parameter]>) -> Result<Response> {
        if text.trim().is_empty() {
            return Err(crate::DatasourceError::message("empty command"));
        }
        let statement = StatementParser::parse(text)?;
        self.execute_statement(statement.as_ref(), parameters).await
    }
    async fn execute_statement(
        &self,
        statement: &dyn Statement,
        parameters: Option<&[Parameter]>,
    ) -> Result<Response> {
        self.execute_native(
            &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
            parameters,
        )
        .await
    }
    async fn execute_reader_statement(
        &self,
        statement: &dyn Statement,
        parameters: Option<&[Parameter]>,
    ) -> Result<Box<dyn Reader>> {
        self.execute_reader_native(
            &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
            parameters,
        )
        .await
    }
}