alpaca-data 0.29.0

Rust client for the Alpaca Market Data HTTP API
Documentation
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};

use crate::stocks::Currency;

use super::{CashDividendSubType, PartialCallLotteryType};

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct CorporateActions {
    #[serde(default)]
    pub forward_splits: Vec<ForwardSplit>,
    #[serde(default)]
    pub reverse_splits: Vec<ReverseSplit>,
    #[serde(default)]
    pub unit_splits: Vec<UnitSplit>,
    #[serde(default)]
    pub stock_dividends: Vec<StockDividend>,
    #[serde(default)]
    pub cash_dividends: Vec<CashDividend>,
    #[serde(default)]
    pub spin_offs: Vec<SpinOff>,
    #[serde(default)]
    pub cash_mergers: Vec<CashMerger>,
    #[serde(default)]
    pub stock_mergers: Vec<StockMerger>,
    #[serde(default)]
    pub stock_and_cash_mergers: Vec<StockAndCashMerger>,
    #[serde(default)]
    pub redemptions: Vec<Redemption>,
    #[serde(default)]
    pub name_changes: Vec<NameChange>,
    #[serde(default)]
    pub worthless_removals: Vec<WorthlessRemoval>,
    #[serde(default)]
    pub rights_distributions: Vec<RightsDistribution>,
    #[serde(default)]
    pub partial_calls: Vec<PartialCall>,
    #[serde(default)]
    pub reorganizations: Vec<Reorganization>,
}

impl CorporateActions {
    pub(crate) fn merge(&mut self, mut next: Self) {
        self.forward_splits.append(&mut next.forward_splits);
        self.reverse_splits.append(&mut next.reverse_splits);
        self.unit_splits.append(&mut next.unit_splits);
        self.stock_dividends.append(&mut next.stock_dividends);
        self.cash_dividends.append(&mut next.cash_dividends);
        self.spin_offs.append(&mut next.spin_offs);
        self.cash_mergers.append(&mut next.cash_mergers);
        self.stock_mergers.append(&mut next.stock_mergers);
        self.stock_and_cash_mergers
            .append(&mut next.stock_and_cash_mergers);
        self.redemptions.append(&mut next.redemptions);
        self.name_changes.append(&mut next.name_changes);
        self.worthless_removals.append(&mut next.worthless_removals);
        self.rights_distributions
            .append(&mut next.rights_distributions);
        self.partial_calls.append(&mut next.partial_calls);
        self.reorganizations.append(&mut next.reorganizations);
    }
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ForwardSplit {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub new_rate: Decimal,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub old_rate: Decimal,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: Option<String>,
    pub due_bill_redemption_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ReverseSplit {
    pub id: String,
    pub symbol: String,
    pub old_cusip: String,
    pub old_isin: Option<String>,
    pub new_cusip: String,
    pub new_isin: Option<String>,
    pub new_symbol: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub new_rate: Decimal,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub old_rate: Decimal,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct UnitSplit {
    pub id: String,
    pub old_symbol: String,
    pub old_cusip: String,
    pub old_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub old_rate: Decimal,
    pub new_symbol: String,
    pub new_cusip: String,
    pub new_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub new_rate: Decimal,
    pub alternate_symbol: String,
    pub alternate_cusip: String,
    pub alternate_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub alternate_rate: Decimal,
    pub currency: Option<Currency>,
    pub process_date: String,
    pub effective_date: String,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct StockDividend {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub rate: Decimal,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct CashDividend {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub rate: Decimal,
    pub special: bool,
    pub foreign: bool,
    pub sub_type: Option<CashDividendSubType>,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: Option<String>,
    pub due_bill_on_date: Option<String>,
    pub due_bill_off_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct SpinOff {
    pub id: String,
    pub source_symbol: String,
    pub source_cusip: String,
    pub source_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub source_rate: Decimal,
    pub new_symbol: String,
    pub new_cusip: String,
    pub new_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub new_rate: Decimal,
    pub currency: Option<Currency>,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: Option<String>,
    pub due_bill_redemption_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct CashMerger {
    pub id: String,
    pub acquirer_symbol: Option<String>,
    pub acquirer_cusip: Option<String>,
    pub acquirer_isin: Option<String>,
    pub acquiree_symbol: String,
    pub acquiree_cusip: String,
    pub acquiree_isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub rate: Decimal,
    pub process_date: String,
    pub effective_date: String,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct StockMerger {
    pub id: String,
    pub acquirer_symbol: String,
    pub acquirer_cusip: String,
    pub acquirer_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub acquirer_rate: Decimal,
    pub acquiree_symbol: String,
    pub acquiree_cusip: String,
    pub acquiree_isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub acquiree_rate: Decimal,
    pub process_date: String,
    pub effective_date: String,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct StockAndCashMerger {
    pub id: String,
    pub acquirer_symbol: String,
    pub acquirer_cusip: String,
    pub acquirer_isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub acquirer_rate: Decimal,
    pub acquiree_symbol: String,
    pub acquiree_cusip: String,
    pub acquiree_isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub acquiree_rate: Decimal,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub cash_rate: Decimal,
    pub process_date: String,
    pub effective_date: String,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Redemption {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub rate: Decimal,
    pub process_date: String,
    pub payable_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct NameChange {
    pub id: String,
    pub old_symbol: String,
    pub old_cusip: String,
    pub old_isin: Option<String>,
    pub new_symbol: String,
    pub new_cusip: String,
    pub new_isin: Option<String>,
    pub currency: Option<Currency>,
    pub process_date: String,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct WorthlessRemoval {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    pub process_date: String,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct RightsDistribution {
    pub id: String,
    pub source_symbol: String,
    pub source_cusip: String,
    pub source_isin: Option<String>,
    pub new_symbol: String,
    pub new_cusip: String,
    pub new_isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub rate: Decimal,
    pub process_date: String,
    pub ex_date: String,
    pub record_date: Option<String>,
    pub payable_date: String,
    pub expiration_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct PartialCall {
    pub id: String,
    pub symbol: String,
    pub process_date: String,
    pub currency: Option<Currency>,
    pub cusip: Option<String>,
    pub isin: Option<String>,
    #[serde(
        default,
        deserialize_with = "alpaca_core::decimal::deserialize_option_decimal_from_string_or_number"
    )]
    pub dividend_rate: Option<Decimal>,
    pub lottery_date: Option<String>,
    pub lottery_type: Option<PartialCallLotteryType>,
    pub payable_date: Option<String>,
    #[serde(
        default,
        deserialize_with = "alpaca_core::decimal::deserialize_option_decimal_from_string_or_number"
    )]
    pub price: Option<Decimal>,
    pub record_date: Option<String>,
    pub results_publication_date: Option<String>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Reorganization {
    pub id: String,
    pub symbol: String,
    pub cusip: String,
    pub process_date: String,
    pub effective_date: String,
    pub isin: Option<String>,
    pub currency: Option<Currency>,
    #[serde(
        default,
        deserialize_with = "alpaca_core::decimal::deserialize_option_decimal_from_string_or_number"
    )]
    pub cash_rate: Option<Decimal>,
    pub payable_date: Option<String>,
    #[serde(default)]
    pub stock_movements: Vec<ReorganizationStockMovement>,
}

#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ReorganizationStockMovement {
    pub symbol: String,
    pub cusip: String,
    pub isin: Option<String>,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub new_rate: Decimal,
    #[serde(deserialize_with = "alpaca_core::decimal::deserialize_decimal_from_string_or_number")]
    pub source_rate: Decimal,
}