mod artifact;
mod expr;
mod navigation;
mod resolve;
mod snapshot;
mod storage;
mod trace;
use super::types::RpcError;
use crate::{error_codes, EngineContext};
use revm::{database::CacheDB, Database, DatabaseCommit, DatabaseRef};
use std::sync::Arc;
use tracing::debug;
pub struct MethodHandler<DB>
where
DB: Database + DatabaseCommit + DatabaseRef + Clone + Send + Sync + 'static,
<CacheDB<DB> as Database>::Error: Clone + Send + Sync,
<DB as Database>::Error: Clone + Send + Sync,
{
context: Arc<EngineContext<DB>>,
}
impl<DB> MethodHandler<DB>
where
DB: Database + DatabaseCommit + DatabaseRef + Clone + Send + Sync + 'static,
<CacheDB<DB> as Database>::Error: Clone + Send + Sync,
<DB as Database>::Error: Clone + Send + Sync,
{
pub fn new(context: Arc<EngineContext<DB>>) -> Self {
Self { context }
}
pub async fn handle_method(
&self,
method: &str,
params: Option<serde_json::Value>,
) -> Result<serde_json::Value, RpcError> {
debug!("Handling RPC method: {}", method);
match method {
"edb_getTrace" => trace::get_trace(&self.context),
"edb_getCode" => artifact::get_code(&self.context, params),
"edb_getConstructorArgs" => artifact::get_constructor_args(&self.context, params),
"edb_getSnapshotCount" => snapshot::get_snapshot_count(&self.context),
"edb_getSnapshotInfo" => snapshot::get_snapshot_info(&self.context, params),
"edb_getContractABI" => resolve::get_contract_abi(&self.context, params),
"edb_getCallableABI" => resolve::get_callable_abi(&self.context, params),
"edb_getNextCall" => navigation::get_next_call(&self.context, params),
"edb_getPrevCall" => navigation::get_prev_call(&self.context, params),
"edb_getStorage" => storage::get_storage(&self.context, params),
"edb_getStorageDiff" => storage::get_storage_diff(&self.context, params),
"edb_evalOnSnapshot" => expr::eval_on_snapshot(&self.context, params),
_ => Err(RpcError {
code: error_codes::METHOD_NOT_FOUND,
message: format!("Method '{method}' not found"),
data: None,
}),
}
}
}