use crate::charge::{Charge, ChargeRequest};
use crate::transfer::{Transfer, TransferRequest};
use crate::webhook::WebhookEvent;
use rustlavel_core::Result;
use rustlavel_http::Headers;
use std::future::Future;
use std::pin::Pin;
pub type GatewayFuture<'a, T> = Pin<Box<dyn Future<Output = Result<T>> + Send + 'a>>;
pub trait Gateway: Send + Sync + 'static {
fn name(&self) -> &'static str;
fn create_charge<'a>(&'a self, request: &'a ChargeRequest) -> GatewayFuture<'a, Charge>;
fn charge<'a>(&'a self, id: &'a str) -> GatewayFuture<'a, Charge>;
fn cancel_charge<'a>(&'a self, id: &'a str) -> GatewayFuture<'a, Charge>;
fn transfer<'a>(&'a self, request: &'a TransferRequest) -> GatewayFuture<'a, Transfer>;
fn batch_transfer<'a>(
&'a self,
requests: &'a [TransferRequest],
) -> GatewayFuture<'a, Vec<Result<Transfer>>> {
Box::pin(async move {
let mut results = Vec::with_capacity(requests.len());
for request in requests {
results.push(self.transfer(request).await);
}
Ok(results)
})
}
fn transfer_status<'a>(&'a self, id: &'a str) -> GatewayFuture<'a, Transfer>;
fn verify_webhook<'a>(&'a self, headers: &'a Headers, body: &'a [u8]) -> Result<WebhookEvent>;
}