mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 09:38:33 +08:00
91 lines
2.5 KiB
Rust
91 lines
2.5 KiB
Rust
use async_trait::async_trait;
|
|
use router_env::{instrument, tracing};
|
|
use serde::{Deserialize, Serialize};
|
|
use strum::EnumString;
|
|
|
|
use crate::{core::errors, routes::AppState, scheduler::consumer, types::storage};
|
|
pub mod payment_sync;
|
|
pub mod refund_router;
|
|
|
|
macro_rules! runners {
|
|
($($body:tt),*) => {
|
|
as_item! {
|
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, EnumString)]
|
|
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
|
|
#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
|
|
pub enum PTRunner {
|
|
$($body),*
|
|
}
|
|
}
|
|
|
|
$( as_item! {
|
|
pub struct $body;
|
|
} )*
|
|
|
|
#[instrument(skip(state))]
|
|
pub async fn perform_workflow_execution<'a>(state: &AppState, process: storage::ProcessTracker, runner: PTRunner)
|
|
where
|
|
{
|
|
match runner {
|
|
$( PTRunner::$body => {
|
|
let flow = &$body;
|
|
consumer::run_executor(state, process, flow).await
|
|
|
|
} ,)*
|
|
}
|
|
}
|
|
};
|
|
}
|
|
macro_rules! as_item {
|
|
($i:item) => {
|
|
$i
|
|
};
|
|
}
|
|
|
|
runners! {
|
|
PaymentsSyncWorkflow,
|
|
RefundWorkflowRouter
|
|
}
|
|
|
|
#[async_trait]
|
|
pub trait ProcessTrackerWorkflow: Send + Sync {
|
|
// The core execution of the workflow
|
|
async fn execute_workflow<'a>(
|
|
&'a self,
|
|
_state: &'a AppState,
|
|
_process: storage::ProcessTracker,
|
|
) -> Result<(), errors::ProcessTrackerError> {
|
|
Err(errors::ProcessTrackerError::NotImplemented)?
|
|
}
|
|
// Callback function after successful execution of the `execute_workflow`
|
|
async fn success_handler<'a>(
|
|
&'a self,
|
|
_state: &'a AppState,
|
|
_process: storage::ProcessTracker,
|
|
) {
|
|
}
|
|
// Callback function after error received from `execute_workflow`
|
|
async fn error_handler<'a>(
|
|
&'a self,
|
|
_state: &'a AppState,
|
|
_process: storage::ProcessTracker,
|
|
_error: errors::ProcessTrackerError,
|
|
) -> errors::CustomResult<(), errors::ProcessTrackerError> {
|
|
Err(errors::ProcessTrackerError::NotImplemented)?
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod workflow_tests {
|
|
#![allow(clippy::unwrap_used)]
|
|
use super::PTRunner;
|
|
use crate::utils::StringExt;
|
|
|
|
#[test]
|
|
fn test_enum_to_string() {
|
|
let string_format = "PAYMENTS_SYNC_WORKFLOW".to_string();
|
|
let enum_format: PTRunner = string_format.parse_enum("PTRunner").unwrap();
|
|
assert_eq!(enum_format, PTRunner::PaymentsSyncWorkflow)
|
|
}
|
|
}
|