openzeppelin_relayer/models/transaction/request/
mod.rs

1pub mod evm;
2pub mod solana;
3pub mod stellar;
4
5use crate::models::{ApiError, NetworkType, RelayerRepoModel};
6use serde::Serialize;
7
8pub use evm::EvmTransactionRequest;
9pub use solana::SolanaTransactionRequest;
10pub use stellar::StellarTransactionRequest;
11use utoipa::ToSchema;
12
13#[derive(Serialize, ToSchema)]
14#[serde(untagged)]
15pub enum NetworkTransactionRequest {
16    Evm(EvmTransactionRequest),
17    Solana(SolanaTransactionRequest),
18    Stellar(StellarTransactionRequest),
19}
20
21impl NetworkTransactionRequest {
22    pub fn from_json(
23        network_type: &NetworkType,
24        json: serde_json::Value,
25    ) -> Result<Self, ApiError> {
26        match network_type {
27            NetworkType::Evm => Ok(Self::Evm(
28                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
29            )),
30            NetworkType::Solana => Ok(Self::Solana(
31                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
32            )),
33            NetworkType::Stellar => Ok(Self::Stellar(
34                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
35            )),
36        }
37    }
38
39    pub fn validate(&self, relayer: &RelayerRepoModel) -> Result<(), ApiError> {
40        match self {
41            NetworkTransactionRequest::Evm(request) => request.validate(relayer),
42            NetworkTransactionRequest::Stellar(request) => request.validate(),
43            _ => Ok(()),
44        }
45    }
46}