#[derive(Debug, Clone)]
pub struct AngelOneUrls {
pub rest_base: &'static str,
pub ws_base: &'static str,
}
impl AngelOneUrls {
pub const MAINNET: Self = Self {
rest_base: "https://apiconnect.angelone.in",
ws_base: "wss://smartapisocket.angelone.in/smart-stream",
};
#[deprecated(note = "Angel One has no testnet. Reject testnet requests with UnsupportedOperation.")]
pub const TESTNET: Self = Self {
rest_base: "https://apiconnect.angelone.in", ws_base: "wss://smartapisocket.angelone.in/smart-stream",
};
pub fn get(_testnet: bool) -> Self {
Self::MAINNET
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AngelOneEndpoint {
Login,
TokenRefresh,
GetProfile,
Logout,
GetFeedToken,
Quote, HistoricalCandles, SearchScrip,
PlaceOrder,
PlaceOrderFullResponse,
ModifyOrder,
CancelOrder,
GetOrderBook,
GetOrderDetails,
GetTradeBook,
CreateGTT,
ModifyGTT,
CancelGTT,
GetGTTDetails,
ListGTT,
GetHoldings,
GetPositions,
ConvertPosition,
GetRMS,
MarginCalculator,
}
impl AngelOneEndpoint {
pub fn path(&self) -> &'static str {
match self {
Self::Login => "/rest/auth/angelbroking/user/v1/loginByPassword",
Self::TokenRefresh => "/rest/auth/angelbroking/jwt/v1/generateTokens",
Self::GetProfile => "/rest/secure/angelbroking/user/v1/getProfile",
Self::Logout => "/rest/secure/angelbroking/user/v1/logout",
Self::GetFeedToken => "/rest/secure/angelbroking/user/v1/getfeedToken",
Self::Quote => "/rest/secure/angelbroking/market/v1/quote/",
Self::HistoricalCandles => "/rest/secure/angelbroking/historical/v1/getCandleData",
Self::SearchScrip => "/rest/secure/angelbroking/order/v1/searchScrip",
Self::PlaceOrder => "/rest/secure/angelbroking/order/v1/placeOrder",
Self::PlaceOrderFullResponse => "/rest/secure/angelbroking/order/v1/placeOrderFullResponse",
Self::ModifyOrder => "/rest/secure/angelbroking/order/v1/modifyOrder",
Self::CancelOrder => "/rest/secure/angelbroking/order/v1/cancelOrder",
Self::GetOrderBook => "/rest/secure/angelbroking/order/v1/getOrderBook",
Self::GetOrderDetails => "/rest/secure/angelbroking/order/v1/details/",
Self::GetTradeBook => "/rest/secure/angelbroking/order/v1/getTradeBook",
Self::CreateGTT => "/rest/secure/angelbroking/gtt/v1/createRule",
Self::ModifyGTT => "/rest/secure/angelbroking/gtt/v1/modifyRule",
Self::CancelGTT => "/rest/secure/angelbroking/gtt/v1/cancelRule",
Self::GetGTTDetails => "/rest/secure/angelbroking/gtt/v1/ruleDetails",
Self::ListGTT => "/rest/secure/angelbroking/gtt/v1/ruleList",
Self::GetHoldings => "/rest/secure/angelbroking/portfolio/v1/getHolding",
Self::GetPositions => "/rest/secure/angelbroking/portfolio/v1/getPosition",
Self::ConvertPosition => "/rest/secure/angelbroking/portfolio/v1/convertPosition",
Self::GetRMS => "/rest/secure/angelbroking/user/v1/getRMS",
Self::MarginCalculator => "/rest/secure/angelbroking/margin/v1/batch",
}
}
pub fn method(&self) -> &'static str {
match self {
Self::Login
| Self::TokenRefresh
| Self::Logout
| Self::Quote
| Self::HistoricalCandles
| Self::SearchScrip
| Self::PlaceOrder
| Self::PlaceOrderFullResponse
| Self::ModifyOrder
| Self::CancelOrder
| Self::CreateGTT
| Self::ModifyGTT
| Self::CancelGTT
| Self::GetGTTDetails
| Self::ListGTT
| Self::MarginCalculator => "POST",
_ => "GET",
}
}
pub fn requires_auth(&self) -> bool {
match self {
Self::Login => false, _ => true, }
}
}
pub fn format_symbol(symbol: &crate::core::types::Symbol) -> String {
symbol.base.to_uppercase()
}
pub fn map_interval(interval: &str) -> &'static str {
match interval {
"1m" => "ONE_MINUTE",
"3m" => "THREE_MINUTE",
"5m" => "FIVE_MINUTE",
"10m" => "TEN_MINUTE",
"15m" => "FIFTEEN_MINUTE",
"30m" => "THIRTY_MINUTE",
"1h" => "ONE_HOUR",
"1d" | "1D" => "ONE_DAY",
_ => "ONE_HOUR", }
}
#[allow(dead_code)]
pub mod exchange_type {
pub const NSE: u8 = 1;
pub const NFO: u8 = 2;
pub const BSE: u8 = 3;
pub const BFO: u8 = 4;
pub const MCX: u8 = 5;
pub const CDS: u8 = 7;
pub const NCDEX: u8 = 13;
}
#[allow(dead_code)]
pub mod ws_mode {
pub const LTP: u8 = 1; pub const QUOTE: u8 = 2; pub const SNAP_QUOTE: u8 = 3; pub const DEPTH_20: u8 = 4; }