alpaca_data/corporate_actions/
model.rs

1use std::collections::BTreeMap;
2
3pub type UnknownCorporateAction = BTreeMap<String, serde_json::Value>;
4
5#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
6pub struct CorporateActions {
7    #[serde(default)]
8    pub forward_splits: Vec<ForwardSplit>,
9    #[serde(default)]
10    pub reverse_splits: Vec<ReverseSplit>,
11    #[serde(default)]
12    pub unit_splits: Vec<UnitSplit>,
13    #[serde(default)]
14    pub stock_dividends: Vec<StockDividend>,
15    #[serde(default)]
16    pub cash_dividends: Vec<CashDividend>,
17    #[serde(default)]
18    pub spin_offs: Vec<SpinOff>,
19    #[serde(default)]
20    pub cash_mergers: Vec<CashMerger>,
21    #[serde(default)]
22    pub stock_mergers: Vec<StockMerger>,
23    #[serde(default)]
24    pub stock_and_cash_mergers: Vec<StockAndCashMerger>,
25    #[serde(default)]
26    pub redemptions: Vec<Redemption>,
27    #[serde(default)]
28    pub name_changes: Vec<NameChange>,
29    #[serde(default)]
30    pub worthless_removals: Vec<WorthlessRemoval>,
31    #[serde(default)]
32    pub rights_distributions: Vec<RightsDistribution>,
33    #[serde(default)]
34    pub contract_adjustments: Vec<UnknownCorporateAction>,
35    #[serde(default)]
36    pub partial_calls: Vec<UnknownCorporateAction>,
37    #[serde(flatten)]
38    pub other: BTreeMap<String, Vec<UnknownCorporateAction>>,
39}
40
41impl CorporateActions {
42    pub(crate) fn merge(&mut self, mut next: Self) {
43        self.forward_splits.append(&mut next.forward_splits);
44        self.reverse_splits.append(&mut next.reverse_splits);
45        self.unit_splits.append(&mut next.unit_splits);
46        self.stock_dividends.append(&mut next.stock_dividends);
47        self.cash_dividends.append(&mut next.cash_dividends);
48        self.spin_offs.append(&mut next.spin_offs);
49        self.cash_mergers.append(&mut next.cash_mergers);
50        self.stock_mergers.append(&mut next.stock_mergers);
51        self.stock_and_cash_mergers
52            .append(&mut next.stock_and_cash_mergers);
53        self.redemptions.append(&mut next.redemptions);
54        self.name_changes.append(&mut next.name_changes);
55        self.worthless_removals.append(&mut next.worthless_removals);
56        self.rights_distributions
57            .append(&mut next.rights_distributions);
58        self.contract_adjustments
59            .append(&mut next.contract_adjustments);
60        self.partial_calls.append(&mut next.partial_calls);
61
62        for (key, mut values) in next.other {
63            self.other.entry(key).or_default().append(&mut values);
64        }
65    }
66}
67
68#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
69pub struct ForwardSplit {
70    pub id: String,
71    pub symbol: String,
72    pub cusip: String,
73    pub new_rate: f64,
74    pub old_rate: f64,
75    pub process_date: String,
76    pub ex_date: String,
77    pub record_date: Option<String>,
78    pub payable_date: Option<String>,
79    pub due_bill_redemption_date: Option<String>,
80}
81
82#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
83pub struct ReverseSplit {
84    pub id: String,
85    pub symbol: String,
86    pub old_cusip: String,
87    pub new_cusip: String,
88    pub new_rate: f64,
89    pub old_rate: f64,
90    pub process_date: String,
91    pub ex_date: String,
92    pub record_date: Option<String>,
93    pub payable_date: Option<String>,
94}
95
96#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
97pub struct UnitSplit {
98    pub id: String,
99    pub old_symbol: String,
100    pub old_cusip: String,
101    pub old_rate: f64,
102    pub new_symbol: String,
103    pub new_cusip: String,
104    pub new_rate: f64,
105    pub alternate_symbol: String,
106    pub alternate_cusip: String,
107    pub alternate_rate: f64,
108    pub process_date: String,
109    pub effective_date: String,
110    pub payable_date: Option<String>,
111}
112
113#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
114pub struct StockDividend {
115    pub id: String,
116    pub symbol: String,
117    pub cusip: String,
118    pub rate: f64,
119    pub process_date: String,
120    pub ex_date: String,
121    pub record_date: Option<String>,
122    pub payable_date: Option<String>,
123}
124
125#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
126pub struct CashDividend {
127    pub id: String,
128    pub symbol: String,
129    pub cusip: String,
130    pub rate: f64,
131    pub special: bool,
132    pub foreign: bool,
133    pub process_date: String,
134    pub ex_date: String,
135    pub record_date: Option<String>,
136    pub payable_date: Option<String>,
137    pub due_bill_on_date: Option<String>,
138    pub due_bill_off_date: Option<String>,
139}
140
141#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
142pub struct SpinOff {
143    pub id: String,
144    pub source_symbol: String,
145    pub source_cusip: String,
146    pub source_rate: f64,
147    pub new_symbol: String,
148    pub new_cusip: String,
149    pub new_rate: f64,
150    pub process_date: String,
151    pub ex_date: String,
152    pub record_date: Option<String>,
153    pub payable_date: Option<String>,
154    pub due_bill_redemption_date: Option<String>,
155}
156
157#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
158pub struct CashMerger {
159    pub id: String,
160    pub acquirer_symbol: Option<String>,
161    pub acquirer_cusip: Option<String>,
162    pub acquiree_symbol: String,
163    pub acquiree_cusip: String,
164    pub rate: f64,
165    pub process_date: String,
166    pub effective_date: String,
167    pub payable_date: Option<String>,
168}
169
170#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
171pub struct StockMerger {
172    pub id: String,
173    pub acquirer_symbol: String,
174    pub acquirer_cusip: String,
175    pub acquirer_rate: f64,
176    pub acquiree_symbol: String,
177    pub acquiree_cusip: String,
178    pub acquiree_rate: f64,
179    pub process_date: String,
180    pub effective_date: String,
181    pub payable_date: Option<String>,
182}
183
184#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
185pub struct StockAndCashMerger {
186    pub id: String,
187    pub acquirer_symbol: String,
188    pub acquirer_cusip: String,
189    pub acquirer_rate: f64,
190    pub acquiree_symbol: String,
191    pub acquiree_cusip: String,
192    pub acquiree_rate: f64,
193    pub cash_rate: f64,
194    pub process_date: String,
195    pub effective_date: String,
196    pub payable_date: Option<String>,
197}
198
199#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
200pub struct Redemption {
201    pub id: String,
202    pub symbol: String,
203    pub cusip: String,
204    pub rate: f64,
205    pub process_date: String,
206    pub payable_date: Option<String>,
207}
208
209#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
210pub struct NameChange {
211    pub id: String,
212    pub old_symbol: String,
213    pub old_cusip: String,
214    pub new_symbol: String,
215    pub new_cusip: String,
216    pub process_date: String,
217}
218
219#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
220pub struct WorthlessRemoval {
221    pub id: String,
222    pub symbol: String,
223    pub cusip: String,
224    pub process_date: String,
225}
226
227#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize)]
228pub struct RightsDistribution {
229    pub id: String,
230    pub source_symbol: String,
231    pub source_cusip: String,
232    pub new_symbol: String,
233    pub new_cusip: String,
234    pub rate: f64,
235    pub process_date: String,
236    pub ex_date: String,
237    pub record_date: Option<String>,
238    pub payable_date: String,
239    pub expiration_date: Option<String>,
240}