webull_rs/endpoints/
orders.rs

1use crate::auth::AuthManager;
2use crate::endpoints::base::BaseEndpoint;
3use crate::error::WebullResult;
4use crate::models::order::{Order, OrderQueryParams, OrderRequest, OrderResponse};
5use reqwest::Client;
6use std::sync::Arc;
7
8/// Endpoints for order operations.
9pub struct OrderEndpoints {
10    /// Base endpoint
11    base: BaseEndpoint,
12}
13
14impl OrderEndpoints {
15    /// Create new order endpoints.
16    pub fn new(client: Client, base_url: String, auth_manager: Arc<AuthManager>) -> Self {
17        Self {
18            base: BaseEndpoint::new(client, base_url, auth_manager),
19        }
20    }
21    
22    /// Place an order.
23    pub async fn place_order(&self, order: &OrderRequest) -> WebullResult<OrderResponse> {
24        self.base.post("/api/trade/order", order).await
25    }
26    
27    /// Cancel an order.
28    pub async fn cancel_order(&self, order_id: &str) -> WebullResult<()> {
29        let path = format!("/api/trade/cancel/{}", order_id);
30        self.base.delete(&path).await
31    }
32    
33    /// Get an order by ID.
34    pub async fn get_order(&self, order_id: &str) -> WebullResult<Order> {
35        let path = format!("/api/trade/order/{}", order_id);
36        self.base.get(&path).await
37    }
38    
39    /// Get orders based on query parameters.
40    pub async fn get_orders(&self, params: &OrderQueryParams) -> WebullResult<Vec<Order>> {
41        self.base.post("/api/trade/orders", params).await
42    }
43    
44    /// Get active orders.
45    pub async fn get_active_orders(&self) -> WebullResult<Vec<Order>> {
46        self.base.get("/api/trade/active").await
47    }
48    
49    /// Get filled orders.
50    pub async fn get_filled_orders(&self) -> WebullResult<Vec<Order>> {
51        self.base.get("/api/trade/filled").await
52    }
53    
54    /// Modify an existing order.
55    pub async fn modify_order(&self, order_id: &str, order: &OrderRequest) -> WebullResult<OrderResponse> {
56        let path = format!("/api/trade/modify/{}", order_id);
57        self.base.put(&path, order).await
58    }
59}