use crate::client::Client;
use crate::config::Config;
use crate::models::*;
use reqwest::Error;
pub struct IG {
client: Client
}
impl IG {
pub fn live(account_id: String, api_key: String, username: String, password: String) -> IG {
IG::new(account_id, api_key, username, password, Config::live())
}
pub fn demo(account_id: String, api_key: String, username: String, password: String) -> IG {
IG::new(account_id, api_key, username, password, Config::demo())
}
pub fn new(account_id: String, api_key: String, username: String, password: String, config: Config) -> IG {
let client = Client::new(account_id, api_key, username, password, config);
IG { client }
}
pub fn get_accounts(&self) -> Result<Accounts, Error> {
let endpoint: String = "/accounts".into();
let data: Accounts = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_preferences(&self) -> Result<Preferences, Error> {
let endpoint: String = "/accounts/preferences".into();
let data: Preferences = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn update_preferences(&self, preferences: &Preferences) -> Result<OkResponse, Error> {
let endpoint: String = "/accounts/preferences".into();
let data: OkResponse = self.client.put_signed(&endpoint, 1, Some(preferences))?;
Ok(data)
}
pub fn get_activity_history(&self, query: &ActivityHistoryQuery) -> Result<ActivityHistory, Error> {
let endpoint: String = "/history/activity".into();
let data: ActivityHistory = self.client.get_signed(&endpoint, 3, Some(query))?;
Ok(data)
}
pub fn get_transaction_history(&self, query: &TransactionHistoryQuery) -> Result<TransactionHistory, Error> {
let endpoint: String = "/history/transactions".into();
let data: TransactionHistory = self.client.get_signed(&endpoint, 2, Some(query))?;
Ok(data)
}
pub fn get_client_sentiments(&self, query: &SentimentQuery) -> Result<Sentiments, Error> {
let endpoint = "/clientsentiment".to_string();
let data: Sentiments = self.client.get_signed(&endpoint, 1, Some(query))?;
Ok(data)
}
pub fn get_client_sentiment(&self, market_id: &String) -> Result<Sentiment, Error> {
let endpoint = format!("/clientsentiment/{}", market_id);
let data: Sentiment = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_related_client_sentiment(&self, market_id: &String) -> Result<Sentiments, Error> {
let endpoint = format!("/clientsentiment/related/{}", market_id);
let data: Sentiments = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_deal_confirmation(&self, deal_reference: &String) -> Result<DealConfirmation, Error> {
let endpoint = format!("/confirms/{}", deal_reference);
let data: DealConfirmation = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_positions(&self) -> Result<Positions, Error> {
let endpoint = "/positions".to_string();
let data: Positions = self.client.get_signed(&endpoint, 2, None::<()>)?;
Ok(data)
}
pub fn get_position(&self, deal_id: &String) -> Result<Position, Error> {
let endpoint = format!("/positions/{}", deal_id);
let data: Position = self.client.get_signed(&endpoint, 2, None::<()>)?;
Ok(data)
}
pub fn close_position(&self, req: &ClosePosition) -> Result<DealRef, Error> {
let endpoint: String = "/positions/otc".into();
let data: DealRef = self.client.delete_signed(&endpoint, 1, Some(req))?;
Ok(data)
}
pub fn create_position(&self, req: &CreatePosition) -> Result<DealRef, Error> {
let endpoint: String = "/positions/otc".into();
let data: DealRef = self.client.post_signed(&endpoint, 2, Some(req))?;
Ok(data)
}
pub fn update_position(&self, deal_id: &String, req: &UpdatePosition) -> Result<DealRef, Error> {
let endpoint = format!("/positions/otc/{}", deal_id);
let data: DealRef = self.client.put_signed(&endpoint, 2, Some(req))?;
Ok(data)
}
pub fn get_sprint_market_positions(&self) -> Result<SprintMarketPositions, Error> {
let endpoint = "/positions/sprintmarkets".to_string();
let data: SprintMarketPositions = self.client.get_signed(&endpoint, 2, None::<()>)?;
Ok(data)
}
pub fn create_sprint_market_position(&self, req: &CreateSprintMarketPosition) -> Result<DealRef, Error> {
let endpoint = "/positions/sprintmarkets".to_string();
let data: DealRef = self.client.post_signed(&endpoint, 1, Some(req))?;
Ok(data)
}
pub fn get_working_orders(&self) -> Result<WorkingOrders, Error> {
let endpoint = "/workingorders".to_string();
let data: WorkingOrders = self.client.get_signed(&endpoint, 2, None::<()>)?;
Ok(data)
}
pub fn create_working_order(&self, req: &CreateWorkingOrder) -> Result<DealRef, Error> {
let endpoint = "/workingorders/otc".to_string();
let data: DealRef = self.client.post_signed(&endpoint, 2, Some(req))?;
Ok(data)
}
pub fn delete_working_order(&self, deal_id: &String) -> Result<DealRef, Error> {
let endpoint = format!("/workingorders/otc/{}", deal_id);
let data: DealRef = self.client.delete_signed(&endpoint, 2, None::<()>)?;
Ok(data)
}
pub fn update_working_order(&self, deal_id: &String, req: &UpdateWorkingOrder) -> Result<DealRef, Error> {
let endpoint = format!("/workingorders/otc/{}", deal_id);
let data: DealRef = self.client.put_signed(&endpoint, 2, Some(req))?;
Ok(data)
}
pub fn get_applications(&self) -> Result<Vec<Application>, Error> {
let endpoint = "/operations/application".to_string();
let data: Vec<Application> = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn update_application(&self, req: &UpdateApplication) -> Result<Application, Error> {
let endpoint = "/operations/application".to_string();
let data: Application = self.client.put_signed(&endpoint, 1, Some(req))?;
Ok(data)
}
pub fn get_session(&self) -> Result<Session, Error> {
let endpoint = "/session".to_string();
let data: Session = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_market_categories(&self) -> Result<MarketCategory, Error> {
let endpoint: String = "/marketnavigation".into();
let data: MarketCategory = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_market_category(&self, node_id: &String) -> Result<MarketCategory, Error> {
let endpoint = format!("/marketnavigation/{}", node_id);
let data: MarketCategory = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_markets(&self, query: &MarketsQuery) -> Result<Markets, Error> {
let endpoint: String = "/markets".into();
let data: Markets = self.client.get_signed(&endpoint, 2, Some(query))?;
Ok(data)
}
pub fn get_market(&self, epic: &String) -> Result<Market, Error> {
let endpoint = format!("/markets/{}", epic);
let data: Market = self.client.get_signed(&endpoint, 3, None::<()>)?;
Ok(data)
}
pub fn search_markets(&self, search_term: &String) -> Result<MarketSearch, Error> {
let endpoint = format!("/markets?searchTerm={}", search_term);
let data: MarketSearch = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_prices(&self, epic: &String, query: &PricesQuery) -> Result<Prices, Error> {
let endpoint = format!("/prices/{}", epic);
let data: Prices = self.client.get_signed(&endpoint, 3, Some(query))?;
Ok(data)
}
pub fn get_watchlists(&self) -> Result<Watchlists, Error> {
let endpoint = "/watchlists".to_string();
let data: Watchlists = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn create_watchlist(&self, req: &CreateWatchlist) -> Result<CreateWatchlistResult, Error> {
let endpoint = "/watchlists".to_string();
let data: CreateWatchlistResult = self.client.post_signed(&endpoint, 1, Some(req))?;
Ok(data)
}
pub fn delete_watchlist(&self, watchlist_id: &String) -> Result<OkResponse, Error> {
let endpoint = format!("/watchlists/{}", watchlist_id);
let data: OkResponse = self.client.delete_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn get_watchlist(&self, watchlist_id: &String) -> Result<MarketSearch, Error> {
let endpoint = format!("/watchlists/{}", watchlist_id);
let data: MarketSearch = self.client.get_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
pub fn add_market_to_watchlist(&self, watchlist_id: &String, req: &AddToWatchlist) -> Result<OkResponse, Error> {
let endpoint = format!("/watchlists/{}", watchlist_id);
let data: OkResponse = self.client.put_signed(&endpoint, 1, Some(req))?;
Ok(data)
}
pub fn remove_market_from_watchlist(&self, watchlist_id: &String, epic: &String) -> Result<OkResponse, Error> {
let endpoint = format!("/watchlists/{}/{}", watchlist_id, epic);
let data: OkResponse = self.client.delete_signed(&endpoint, 1, None::<()>)?;
Ok(data)
}
}