1pub mod charges;
2pub mod error_response;
3pub mod expired_instruments;
4pub mod gtt_orders;
5pub mod historical_data;
6pub mod instruments;
7pub mod login;
8pub mod margins;
9pub mod market_information;
10pub mod market_quote;
11pub mod option_chain;
12pub mod orders;
13pub mod portfolio;
14pub mod success_response;
15pub mod trade_profit_and_loss;
16pub mod user;
17pub mod ws;
18
19use {
20 crate::utils::serde_spaced_lowercase,
21 serde::{Deserialize, Deserializer, Serialize, Serializer},
22 std::{
23 fmt::{self, Display},
24 str::FromStr,
25 },
26};
27
28#[derive(Deserialize, Serialize, Debug)]
29pub struct ResponseSummary {
30 pub total: u32,
31 pub payload_error: Option<u32>,
32 pub success: u32,
33 pub error: u32,
34}
35
36#[derive(Deserialize, Serialize, Clone, Debug)]
37#[serde(rename_all = "UPPERCASE")]
38pub enum AssetType {
39 COM,
40 INDEX,
41 EQUITY,
42 CUR,
43 IRD,
44}
45
46#[derive(Deserialize, Serialize, Debug, Eq, Hash, Clone, PartialEq)]
47#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
48pub enum ExchangeSegment {
49 NseEq,
50 NseIndex,
51 NseFo,
52 NseCom,
53 NcdFo,
54 BseEq,
55 BseIndex,
56 BseFo,
57 BcdFo,
58 McxFo,
59}
60
61#[derive(Deserialize, Serialize, Debug, PartialEq)]
62#[serde(rename_all = "UPPERCASE")]
63pub enum ProductType {
64 I,
65 D,
66 CO,
67 MTF,
68}
69
70#[derive(Deserialize, Serialize, Debug)]
71#[serde(rename_all = "UPPERCASE")]
72pub enum TransactionType {
73 Buy,
74 Sell,
75}
76
77#[derive(Deserialize, Serialize, Debug, PartialEq)]
78#[serde(rename_all = "UPPERCASE")]
79pub enum SegmentType {
80 EQ,
81 FO,
82 COM,
83 CD,
84 MF,
85}
86
87#[derive(Deserialize, Serialize, Clone, Debug)]
88#[serde(rename_all = "UPPERCASE")]
89pub enum Exchange {
90 NSE,
91 NFO,
92 CDS,
93 BSE,
94 BFO,
95 BCD,
96 MCX,
97}
98
99impl Display for Exchange {
100 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101 let s: &str = match self {
102 Exchange::NSE => "NSE",
103 Exchange::NFO => "NFO",
104 Exchange::CDS => "CDS",
105 Exchange::BSE => "BSE",
106 Exchange::BFO => "BFO",
107 Exchange::BCD => "BCD",
108 Exchange::MCX => "MCX",
109 };
110 write!(f, "{}", s)
111 }
112}
113
114#[derive(Deserialize, Serialize, Debug)]
115#[serde(rename_all = "UPPERCASE")]
116pub enum OrderVariety {
117 Simple,
118 AMO,
119 CO,
120 OCO,
121}
122
123#[derive(Debug)]
124pub enum OrderStatus {
125 ValidationPending,
126 ModifyPending,
127 TriggerPending,
128 PutOrderReqReceived,
129 ModifyAfterMarketOrderReqReceived,
130 CancelledAfterMarketOrder,
131 Open,
132 Complete,
133 ModifyValidationPending,
134 AfterMarketOrderReqReceived,
135 Modified,
136 NotCancelled,
137 CancelPending,
138 Rejected,
139 Cancelled,
140 OpenPending,
141 NotModified,
142}
143
144impl Display for OrderStatus {
145 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
146 let s: &str = match self {
147 OrderStatus::ValidationPending => "ValidationPending",
148 OrderStatus::ModifyPending => "ModifyPending",
149 OrderStatus::TriggerPending => "TriggerPending",
150 OrderStatus::PutOrderReqReceived => "PutOrderReqReceived",
151 OrderStatus::ModifyAfterMarketOrderReqReceived => "ModifyAfterMarketOrderReqReceived",
152 OrderStatus::CancelledAfterMarketOrder => "CancelledAfterMarketOrder",
153 OrderStatus::Open => "Open",
154 OrderStatus::Complete => "Complete",
155 OrderStatus::ModifyValidationPending => "ModifyValidationPending",
156 OrderStatus::AfterMarketOrderReqReceived => "AfterMarketOrderReqReceived",
157 OrderStatus::Modified => "Modified",
158 OrderStatus::NotCancelled => "NotCancelled",
159 OrderStatus::CancelPending => "CancelPending",
160 OrderStatus::Rejected => "Rejected",
161 OrderStatus::Cancelled => "Cancelled",
162 OrderStatus::OpenPending => "OpenPending",
163 OrderStatus::NotModified => "NotModified",
164 };
165 write!(f, "{}", s)
166 }
167}
168
169impl FromStr for OrderStatus {
170 type Err = &'static str;
171
172 fn from_str(s: &str) -> Result<Self, Self::Err> {
173 match s {
174 "validation pending" => Ok(OrderStatus::ValidationPending),
175 "modify pending" => Ok(OrderStatus::ModifyPending),
176 "trigger pending" => Ok(OrderStatus::TriggerPending),
177 "put order req received" => Ok(OrderStatus::PutOrderReqReceived),
178 "modify after market order req received" => {
179 Ok(OrderStatus::ModifyAfterMarketOrderReqReceived)
180 }
181 "cancelled after market order" => Ok(OrderStatus::CancelledAfterMarketOrder),
182 "open" => Ok(OrderStatus::Open),
183 "complete" => Ok(OrderStatus::Complete),
184 "modify validation pending" => Ok(OrderStatus::ModifyValidationPending),
185 "after market order req received" => Ok(OrderStatus::AfterMarketOrderReqReceived),
186 "modified" => Ok(OrderStatus::Modified),
187 "not cancelled" => Ok(OrderStatus::NotCancelled),
188 "cancel pending" => Ok(OrderStatus::CancelPending),
189 "rejected" => Ok(OrderStatus::Rejected),
190 "cancelled" => Ok(OrderStatus::Cancelled),
191 "open pending" => Ok(OrderStatus::OpenPending),
192 "not modified" => Ok(OrderStatus::NotModified),
193 _ => Err("Invalid order status"),
194 }
195 }
196}
197
198impl Serialize for OrderStatus {
199 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
200 where
201 S: Serializer,
202 {
203 serde_spaced_lowercase::serialize(self, serializer)
204 }
205}
206
207impl<'de> Deserialize<'de> for OrderStatus {
208 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
209 where
210 D: Deserializer<'de>,
211 {
212 serde_spaced_lowercase::deserialize(deserializer)
213 }
214}