webull_rs/endpoints/
watchlists.rs

1use crate::auth::AuthManager;
2use crate::endpoints::base::BaseEndpoint;
3use crate::error::WebullResult;
4use reqwest::Client;
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7
8/// Watchlist information.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Watchlist {
11    /// Watchlist ID
12    pub id: String,
13    
14    /// Watchlist name
15    pub name: String,
16    
17    /// Watchlist symbols
18    pub symbols: Vec<String>,
19}
20
21/// Request to create a watchlist.
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct CreateWatchlistRequest {
24    /// Watchlist name
25    pub name: String,
26    
27    /// Watchlist symbols
28    pub symbols: Vec<String>,
29}
30
31/// Request to modify a watchlist.
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ModifyWatchlistRequest {
34    /// Watchlist ID
35    pub id: String,
36    
37    /// Watchlist name
38    pub name: Option<String>,
39    
40    /// Watchlist symbols to add
41    pub add_symbols: Option<Vec<String>>,
42    
43    /// Watchlist symbols to remove
44    pub remove_symbols: Option<Vec<String>>,
45}
46
47/// Endpoints for watchlist operations.
48pub struct WatchlistEndpoints {
49    /// Base endpoint
50    base: BaseEndpoint,
51}
52
53impl WatchlistEndpoints {
54    /// Create new watchlist endpoints.
55    pub fn new(client: Client, base_url: String, auth_manager: Arc<AuthManager>) -> Self {
56        Self {
57            base: BaseEndpoint::new(client, base_url, auth_manager),
58        }
59    }
60    
61    /// Get all watchlists.
62    pub async fn get_watchlists(&self) -> WebullResult<Vec<Watchlist>> {
63        self.base.get("/api/wlas/watchlist").await
64    }
65    
66    /// Get a watchlist by ID.
67    pub async fn get_watchlist(&self, watchlist_id: &str) -> WebullResult<Watchlist> {
68        let path = format!("/api/wlas/watchlist/{}", watchlist_id);
69        self.base.get(&path).await
70    }
71    
72    /// Create a watchlist.
73    pub async fn create_watchlist(&self, request: &CreateWatchlistRequest) -> WebullResult<Watchlist> {
74        self.base.post("/api/wlas/watchlist", request).await
75    }
76    
77    /// Modify a watchlist.
78    pub async fn modify_watchlist(&self, request: &ModifyWatchlistRequest) -> WebullResult<Watchlist> {
79        self.base.post("/api/wlas/watchlist/modify", request).await
80    }
81    
82    /// Delete a watchlist.
83    pub async fn delete_watchlist(&self, watchlist_id: &str) -> WebullResult<()> {
84        let path = format!("/api/wlas/watchlist/delete/{}", watchlist_id);
85        self.base.delete(&path).await
86    }
87    
88    /// Add symbols to a watchlist.
89    pub async fn add_symbols(&self, watchlist_id: &str, symbols: &[String]) -> WebullResult<Watchlist> {
90        let request = ModifyWatchlistRequest {
91            id: watchlist_id.to_string(),
92            name: None,
93            add_symbols: Some(symbols.to_vec()),
94            remove_symbols: None,
95        };
96        
97        self.modify_watchlist(&request).await
98    }
99    
100    /// Remove symbols from a watchlist.
101    pub async fn remove_symbols(&self, watchlist_id: &str, symbols: &[String]) -> WebullResult<Watchlist> {
102        let request = ModifyWatchlistRequest {
103            id: watchlist_id.to_string(),
104            name: None,
105            add_symbols: None,
106            remove_symbols: Some(symbols.to_vec()),
107        };
108        
109        self.modify_watchlist(&request).await
110    }
111    
112    /// Rename a watchlist.
113    pub async fn rename_watchlist(&self, watchlist_id: &str, name: &str) -> WebullResult<Watchlist> {
114        let request = ModifyWatchlistRequest {
115            id: watchlist_id.to_string(),
116            name: Some(name.to_string()),
117            add_symbols: None,
118            remove_symbols: None,
119        };
120        
121        self.modify_watchlist(&request).await
122    }
123}