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}