Skip to main content

qs_backtest_api/
client.rs

1use 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/// Provider-neutral client port for the retained backtest-job workflow.
17#[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}