pub mod intercept_log;
pub mod intercept_page;
use crate::executor::Executor;
use crate::Error;
use async_trait::async_trait;
use rbdc::db::ExecResult;
use rbs::Value;
use std::any::Any;
use std::fmt::Debug;
#[derive(Debug, Clone)]
pub enum ResultType<A, B> {
Exec( A),
Query( B),
}
impl<A, B> ResultType<A, B> {
pub fn type_name<'a, 'b>(&'a self) -> &'b str {
match self {
ResultType::Exec(_) => "exec",
ResultType::Query(_) => "query",
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum Action {
Next,
Return,
}
#[async_trait]
pub trait Intercept: Any + Send + Sync + Debug {
fn name(&self) -> &str {
std::any::type_name::<Self>()
}
async fn before(
&self,
_task_id: i64,
_rb: &dyn Executor,
_sql: &mut String,
_args: &mut Vec<Value>,
_result: ResultType<&mut Result<ExecResult, Error>, &mut Result<Value, Error>>,
) -> Result<Action, Error> {
Ok(Action::Next)
}
async fn after(
&self,
_task_id: i64,
_rb: &dyn Executor,
_sql: &mut String,
_args: &mut Vec<Value>,
_result: ResultType<&mut Result<ExecResult, Error>, &mut Result<Value, Error>>,
) -> Result<Action, Error> {
Ok(Action::Next)
}
}