nautilus_model/python/account/
transformer.rs1use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err};
17use pyo3::{prelude::*, types::PyDict};
18
19use crate::{
20 accounts::{Account, CashAccount, MarginAccount},
21 events::AccountState,
22};
23
24#[pyfunction]
34#[pyo3(signature = (events, calculate_account_state, allow_borrowing = false))]
35pub fn cash_account_from_account_events(
36 events: Vec<Bound<'_, PyDict>>,
37 calculate_account_state: bool,
38 allow_borrowing: bool,
39) -> PyResult<CashAccount> {
40 let account_events = events
41 .into_iter()
42 .map(|obj| AccountState::py_from_dict(&obj))
43 .collect::<PyResult<Vec<AccountState>>>()
44 .unwrap();
45 if account_events.is_empty() {
46 return Err(to_pyvalue_err("No account events"));
47 }
48 let init_event = account_events[0].clone();
49 let mut cash_account = CashAccount::new(init_event, calculate_account_state, allow_borrowing);
50 for event in account_events.iter().skip(1) {
51 cash_account
52 .apply(event.clone())
53 .map_err(to_pyruntime_err)?;
54 }
55 Ok(cash_account)
56}
57
58#[pyfunction]
68pub fn margin_account_from_account_events(
69 events: Vec<Bound<'_, PyDict>>,
70 calculate_account_state: bool,
71) -> PyResult<MarginAccount> {
72 let account_events = events
73 .into_iter()
74 .map(|obj| AccountState::py_from_dict(&obj))
75 .collect::<PyResult<Vec<AccountState>>>()
76 .unwrap();
77 if account_events.is_empty() {
78 return Err(to_pyvalue_err("No account events"));
79 }
80 let init_event = account_events[0].clone();
81 let mut margin_account = MarginAccount::new(init_event, calculate_account_state);
82 for event in account_events.iter().skip(1) {
83 margin_account
84 .apply(event.clone())
85 .map_err(to_pyruntime_err)?;
86 }
87 Ok(margin_account)
88}