use crate::models::account_bucket_instruments_detailed_response::AccountBucketInstrumentsDetailedResponse;
use crate::models::dividend_cache_action::DividendCashAction;
use crate::models::icon::Icon;
use serde_with::serde_as;
use time::format_description::well_known::Rfc3339;
use time::OffsetDateTime;
#[serde_as]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PieRequest {
#[serde(rename = "dividendCashAction")]
pub dividend_cash_action: DividendCashAction,
#[serde(rename = "endDate")]
#[serde_as(as = "Rfc3339")]
pub end_date: OffsetDateTime,
#[serde(rename = "goal")]
pub goal: f32,
#[serde(rename = "icon")]
pub icon: Icon,
#[serde(rename = "instrumentShares")]
pub instrument_shares: ::std::collections::HashMap<String, f32>,
#[serde(rename = "name")]
pub name: String,
}
impl PieRequest {
#[must_use]
pub fn new() -> Self {
Self {
dividend_cash_action: DividendCashAction::Reinvest,
end_date: OffsetDateTime::UNIX_EPOCH,
goal: 0.0,
icon: Icon::Home,
instrument_shares: std::collections::HashMap::new(),
name: String::new(),
}
}
}
impl TryFrom<AccountBucketInstrumentsDetailedResponse> for PieRequest {
type Error = ();
fn try_from(bucket: AccountBucketInstrumentsDetailedResponse) -> Result<Self, Self::Error> {
let mut instrument_shares = std::collections::HashMap::new();
for instrument in bucket.instruments {
instrument_shares.insert(instrument.ticker, instrument.expected_share);
}
Ok(Self {
dividend_cash_action: bucket.settings.dividend_cash_action,
end_date: bucket
.settings
.end_date
.unwrap_or_else(OffsetDateTime::now_utc),
goal: bucket.settings.goal.unwrap_or_default(),
icon: bucket.settings.icon.unwrap_or_default(),
instrument_shares,
name: bucket.settings.name,
})
}
}
impl Default for PieRequest {
fn default() -> Self {
Self::new()
}
}