webull_rs/endpoints/
watchlists.rs1use 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#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Watchlist {
11 pub id: String,
13
14 pub name: String,
16
17 pub symbols: Vec<String>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct CreateWatchlistRequest {
24 pub name: String,
26
27 pub symbols: Vec<String>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ModifyWatchlistRequest {
34 pub id: String,
36
37 pub name: Option<String>,
39
40 pub add_symbols: Option<Vec<String>>,
42
43 pub remove_symbols: Option<Vec<String>>,
45}
46
47pub struct WatchlistEndpoints {
49 base: BaseEndpoint,
51}
52
53impl WatchlistEndpoints {
54 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 pub async fn get_watchlists(&self) -> WebullResult<Vec<Watchlist>> {
63 self.base.get("/api/wlas/watchlist").await
64 }
65
66 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 pub async fn create_watchlist(&self, request: &CreateWatchlistRequest) -> WebullResult<Watchlist> {
74 self.base.post("/api/wlas/watchlist", request).await
75 }
76
77 pub async fn modify_watchlist(&self, request: &ModifyWatchlistRequest) -> WebullResult<Watchlist> {
79 self.base.post("/api/wlas/watchlist/modify", request).await
80 }
81
82 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 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 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 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}