openzeppelin_relayer/domain/relayer/
util.rs

1/// This module provides utility functions and structures for managing and interacting
2/// with relayers within the application. It includes functions to retrieve relayers
3/// by ID, construct network relayers, and handle unsupported operations for specific
4/// relayer types.
5///
6/// The primary components of this module are:
7/// - `get_relayer_by_id`: Retrieves a relayer from the repository using its ID.
8/// - `get_network_relayer`: Constructs a network relayer using a relayer ID.
9/// - `get_network_relayer_by_model`: Constructs a network relayer using a relayer model.
10/// - `solana_not_supported`: Returns an error for unsupported Solana relayer operations.
11///
12/// These utilities are essential for the application's relayer management and
13/// interaction with the underlying repositories and factories.
14use actix_web::web::ThinData;
15
16use crate::{
17    domain::{RelayerFactory, RelayerFactoryTrait},
18    jobs::JobProducerTrait,
19    models::{ApiError, AppState, RelayerError, RelayerRepoModel},
20    repositories::Repository,
21};
22
23use super::NetworkRelayer;
24
25/// Retrieves a relayer by its ID from the repository.
26///
27/// # Arguments
28///
29/// * `relayer_id` - A string slice that holds the ID of the relayer.
30/// * `state` - A reference to the application state.
31///
32/// # Returns
33///
34/// * `Result<RelayerRepoModel, ApiError>` - Returns a `RelayerRepoModel` on success, or an
35///   `ApiError` on failure.
36pub async fn get_relayer_by_id<P>(
37    relayer_id: String,
38    state: &ThinData<AppState<P>>,
39) -> Result<RelayerRepoModel, ApiError>
40where
41    P: JobProducerTrait + 'static,
42{
43    state
44        .relayer_repository
45        .get_by_id(relayer_id)
46        .await
47        .map_err(|e| e.into())
48}
49
50/// Retrieves a network relayer by its ID, constructing it using the relayer and signer models.
51///
52/// # Arguments
53///
54/// * `relayer_id` - A string slice that holds the ID of the relayer.
55/// * `state` - A reference to the application state.
56///
57/// # Returns
58///
59/// * `Result<NetworkRelayer, ApiError>` - Returns a `NetworkRelayer` on success, or an `ApiError`
60///   on failure.
61pub async fn get_network_relayer<P: JobProducerTrait + 'static>(
62    relayer_id: String,
63    state: &ThinData<AppState<P>>,
64) -> Result<NetworkRelayer<P>, ApiError> {
65    let relayer_model = get_relayer_by_id(relayer_id, state).await?;
66    let signer_model = state
67        .signer_repository
68        .get_by_id(relayer_model.signer_id.clone())
69        .await?;
70
71    RelayerFactory::create_relayer(relayer_model, signer_model, state)
72        .await
73        .map_err(|e| e.into())
74}
75
76/// Constructs a network relayer using a given relayer model.
77///
78/// # Arguments
79///
80/// * `relayer_model` - A `RelayerRepoModel` that holds the relayer data.
81/// * `state` - A reference to the application state.
82///
83/// # Returns
84///
85/// * `Result<NetworkRelayer, ApiError>` - Returns a `NetworkRelayer` on success, or an `ApiError`
86///   on failure.
87pub async fn get_network_relayer_by_model<P: JobProducerTrait + 'static>(
88    relayer_model: RelayerRepoModel,
89    state: &ThinData<AppState<P>>,
90) -> Result<NetworkRelayer<P>, ApiError> {
91    let signer_model = state
92        .signer_repository
93        .get_by_id(relayer_model.signer_id.clone())
94        .await?;
95
96    RelayerFactory::create_relayer(relayer_model, signer_model, state)
97        .await
98        .map_err(|e| e.into())
99}
100
101/// Returns an error indicating that the endpoint is not supported for Solana relayers.
102///
103/// # Returns
104///
105/// * `Result<T, RelayerError>` - Always returns a `RelayerError::NotSupported`.
106pub fn solana_not_supported_relayer<T>() -> Result<T, RelayerError> {
107    Err(RelayerError::NotSupported(
108        "Endpoint is not supported for Solana relayers".to_string(),
109    ))
110}