qs_backtest_api/
client.rs1use std::pin::Pin;
2
3use async_trait::async_trait;
4use futures::Stream;
5use qs_service::TransportFailure;
6use thiserror::Error;
7
8use crate::{
9 BacktestEvent, BacktestStatusResponse, CancelBacktestResponse, GetBacktestResultResponse,
10 PingResponse, SubmitBacktestRequest, SubmitBacktestResponse,
11};
12
13pub type BacktestEventStream =
14 Pin<Box<dyn Stream<Item = Result<BacktestEvent, BacktestClientError>> + Send>>;
15
16#[async_trait]
18pub trait BacktestClient: Send + Sync {
19 async fn ping(&self) -> Result<PingResponse, BacktestClientError>;
20 async fn submit(
21 &self,
22 request: SubmitBacktestRequest,
23 ) -> Result<SubmitBacktestResponse, BacktestClientError>;
24 async fn status(&self, job_id: &str) -> Result<BacktestStatusResponse, BacktestClientError>;
25 async fn watch(&self, job_id: &str) -> Result<BacktestEventStream, BacktestClientError>;
26 async fn result(&self, job_id: &str) -> Result<GetBacktestResultResponse, BacktestClientError>;
27 async fn cancel(&self, job_id: &str) -> Result<CancelBacktestResponse, BacktestClientError>;
28}
29
30#[derive(Debug, Clone, Error)]
31pub enum BacktestClientError {
32 #[error("backtest service rejected the request: {0}")]
33 Service(String),
34 #[error(transparent)]
35 Transport(#[from] TransportFailure),
36 #[error(transparent)]
37 Protocol(#[from] BacktestServiceProtocolError),
38}
39
40#[derive(Debug, Clone, Error)]
41#[error("backtest service protocol failure: {detail}")]
42pub struct BacktestServiceProtocolError {
43 pub detail: String,
44}