use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProfileResponse {
pub code: i64,
pub s: String,
pub message: String,
pub data: ProfileData,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProfileData {
pub name: String,
pub image: Option<String>,
pub display_name: Option<String>,
pub email_id: String,
#[serde(rename = "PAN", alias = "pan")]
pub pan: String,
pub fy_id: String,
pub pin_change_date: Option<String>,
pub mobile_number: String,
pub totp: bool,
pub pwd_change_date: Option<String>,
pub pwd_to_expire: i64,
pub ddpi_enabled: bool,
pub mtf_enabled: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FundsResponse {
pub code: i64,
pub s: String,
pub message: String,
pub fund_limit: Vec<FundLimit>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FundLimit {
pub id: i64,
pub title: String,
#[serde(rename = "equityAmount")]
pub equity_amount: f64,
#[serde(rename = "commodityAmount")]
pub commodity_amount: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HoldingsResponse {
pub code: i64,
pub s: String,
pub message: String,
pub holdings: Vec<Holding>,
pub overall: HoldingsOverall,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Holding {
#[serde(rename = "holdingType")]
pub holding_type: String,
pub quantity: i64,
#[serde(rename = "costPrice")]
pub cost_price: f64,
#[serde(rename = "marketVal")]
pub market_val: f64,
#[serde(rename = "remainingQuantity")]
pub remaining_quantity: i64,
pub pl: f64,
pub ltp: f64,
pub id: i64,
#[serde(
rename = "fyToken",
alias = "fytoken",
deserialize_with = "deserialize_string_from_value"
)]
pub fy_token: String,
pub exchange: i64,
pub symbol: String,
pub segment: i64,
pub isin: String,
pub qty_t1: i64,
#[serde(rename = "remainingPledgeQuantity")]
pub remaining_pledge_quantity: i64,
#[serde(rename = "collateralQuantity")]
pub collateral_quantity: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HoldingsOverall {
pub count_total: i64,
pub total_investment: f64,
pub total_current_value: f64,
pub total_pl: f64,
pub pnl_perc: f64,
}
fn deserialize_string_from_value<'de, D>(deserializer: D) -> std::result::Result<String, D::Error>
where
D: Deserializer<'de>,
{
match Value::deserialize(deserializer)? {
Value::String(value) => Ok(value),
Value::Number(value) => Ok(value.to_string()),
other => Err(serde::de::Error::custom(format!(
"expected string or number, got {other}"
))),
}
}