use crate::error::AppError;
use crate::model::requests::{
ClosePositionRequest, CreateOrderRequest, CreateWorkingOrderRequest, UpdatePositionRequest,
UpdateWorkingOrderRequest,
};
use crate::model::responses::{
ClosePositionResponse, CreateOrderResponse, CreateWorkingOrderResponse,
OrderConfirmationResponse, SinglePositionResponse, UpdatePositionResponse,
};
use async_trait::async_trait;
#[async_trait]
pub trait OrderService: Send + Sync {
async fn create_order(
&self,
order: &CreateOrderRequest,
) -> Result<CreateOrderResponse, AppError>;
async fn get_order_confirmation(
&self,
deal_reference: &str,
) -> Result<OrderConfirmationResponse, AppError>;
async fn get_order_confirmation_w_retry(
&self,
deal_reference: &str,
retries: u64,
delay_ms: u64,
) -> Result<OrderConfirmationResponse, AppError>;
async fn update_position(
&self,
deal_id: &str,
update: &UpdatePositionRequest,
) -> Result<UpdatePositionResponse, AppError>;
async fn update_level_in_position(
&self,
deal_id: &str,
limit_level: Option<f64>,
) -> Result<UpdatePositionResponse, AppError>;
async fn close_position(
&self,
close_request: &ClosePositionRequest,
) -> Result<ClosePositionResponse, AppError>;
async fn create_working_order(
&self,
order: &CreateWorkingOrderRequest,
) -> Result<CreateWorkingOrderResponse, AppError>;
async fn delete_working_order(&self, deal_id: &str) -> Result<(), AppError>;
async fn get_position(&self, deal_id: &str) -> Result<SinglePositionResponse, AppError>;
async fn update_working_order(
&self,
deal_id: &str,
update: &UpdateWorkingOrderRequest,
) -> Result<CreateWorkingOrderResponse, AppError>;
}