use crate::auth::AuthManager;
use crate::endpoints::base::BaseEndpoint;
use crate::error::WebullResult;
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Watchlist {
pub id: String,
pub name: String,
pub symbols: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateWatchlistRequest {
pub name: String,
pub symbols: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModifyWatchlistRequest {
pub id: String,
pub name: Option<String>,
pub add_symbols: Option<Vec<String>>,
pub remove_symbols: Option<Vec<String>>,
}
pub struct WatchlistEndpoints {
base: BaseEndpoint,
}
impl WatchlistEndpoints {
pub fn new(client: Client, base_url: String, auth_manager: Arc<AuthManager>) -> Self {
Self {
base: BaseEndpoint::new(client, base_url, auth_manager),
}
}
pub async fn get_watchlists(&self) -> WebullResult<Vec<Watchlist>> {
self.base.get("/api/wlas/watchlist").await
}
pub async fn get_watchlist(&self, watchlist_id: &str) -> WebullResult<Watchlist> {
let path = format!("/api/wlas/watchlist/{}", watchlist_id);
self.base.get(&path).await
}
pub async fn create_watchlist(&self, request: &CreateWatchlistRequest) -> WebullResult<Watchlist> {
self.base.post("/api/wlas/watchlist", request).await
}
pub async fn modify_watchlist(&self, request: &ModifyWatchlistRequest) -> WebullResult<Watchlist> {
self.base.post("/api/wlas/watchlist/modify", request).await
}
pub async fn delete_watchlist(&self, watchlist_id: &str) -> WebullResult<()> {
let path = format!("/api/wlas/watchlist/delete/{}", watchlist_id);
self.base.delete(&path).await
}
pub async fn add_symbols(&self, watchlist_id: &str, symbols: &[String]) -> WebullResult<Watchlist> {
let request = ModifyWatchlistRequest {
id: watchlist_id.to_string(),
name: None,
add_symbols: Some(symbols.to_vec()),
remove_symbols: None,
};
self.modify_watchlist(&request).await
}
pub async fn remove_symbols(&self, watchlist_id: &str, symbols: &[String]) -> WebullResult<Watchlist> {
let request = ModifyWatchlistRequest {
id: watchlist_id.to_string(),
name: None,
add_symbols: None,
remove_symbols: Some(symbols.to_vec()),
};
self.modify_watchlist(&request).await
}
pub async fn rename_watchlist(&self, watchlist_id: &str, name: &str) -> WebullResult<Watchlist> {
let request = ModifyWatchlistRequest {
id: watchlist_id.to_string(),
name: Some(name.to_string()),
add_symbols: None,
remove_symbols: None,
};
self.modify_watchlist(&request).await
}
}