1use crate::command_middleware::CommandMiddleware;
2use crate::connection::Connection;
3use crate::native::Native;
4use crate::parameter::Parameter;
5use crate::reader::Reader;
6use crate::response::Response;
7use crate::result::Result;
8use crate::statement::Statement;
9use crate::statement_parser::StatementParser;
10use async_trait::async_trait;
11use std::sync::Arc;
12
13#[async_trait]
14pub trait Command: Send + Sync {
15 fn connection(&self) -> Arc<dyn Connection>;
16 fn add_middleware(&self, middleware: Arc<dyn CommandMiddleware>);
17 async fn execute_reader_native(
18 &self,
19 text: &Native,
20 parameters: Option<&[Parameter]>,
21 ) -> Result<Box<dyn Reader>>;
22 async fn execute_native(
23 &self,
24 text: &Native,
25 parameters: Option<&[Parameter]>,
26 ) -> Result<Response>;
27 async fn execute_reader(
28 &self,
29 text: &str,
30 parameters: Option<&[Parameter]>,
31 ) -> Result<Box<dyn Reader>> {
32 if text.trim().is_empty() {
33 return Err(crate::DatasourceError::message("empty command"));
34 }
35 let statement = StatementParser::parse(text)?;
36 self.execute_reader_statement(statement.as_ref(), parameters)
37 .await
38 }
39 async fn execute(&self, text: &str, parameters: Option<&[Parameter]>) -> Result<Response> {
40 if text.trim().is_empty() {
41 return Err(crate::DatasourceError::message("empty command"));
42 }
43 let statement = StatementParser::parse(text)?;
44 self.execute_statement(statement.as_ref(), parameters).await
45 }
46 async fn execute_statement(
47 &self,
48 statement: &dyn Statement,
49 parameters: Option<&[Parameter]>,
50 ) -> Result<Response> {
51 self.execute_native(
52 &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
53 parameters,
54 )
55 .await
56 }
57 async fn execute_reader_statement(
58 &self,
59 statement: &dyn Statement,
60 parameters: Option<&[Parameter]>,
61 ) -> Result<Box<dyn Reader>> {
62 self.execute_reader_native(
63 &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
64 parameters,
65 )
66 .await
67 }
68}