nautilus_infrastructure/sql/models/
types.rs1use nautilus_common::signal::Signal;
17use nautilus_core::UnixNanos;
18use nautilus_model::types::Currency;
19use sqlx::{FromRow, Row, postgres::PgRow};
20use ustr::Ustr;
21
22use crate::sql::models::enums::CurrencyTypeModel;
23
24#[derive(Debug)]
25pub struct CurrencyModel(pub Currency);
26
27#[derive(Debug)]
28pub struct SignalModel(pub Signal);
29
30impl<'r> FromRow<'r, PgRow> for CurrencyModel {
31 fn from_row(row: &'r PgRow) -> Result<Self, sqlx::Error> {
32 let id = row.try_get::<String, _>("id")?;
33 let precision = row.try_get::<i32, _>("precision")?;
34 let iso4217 = row.try_get::<i32, _>("iso4217")?;
35 let name = row.try_get::<String, _>("name")?;
36 let currency_type_model = row.try_get::<CurrencyTypeModel, _>("currency_type")?;
37 let currency = Currency::new(
38 id.as_str(),
39 precision as u8,
40 iso4217 as u16,
41 name.as_str(),
42 currency_type_model.0,
43 );
44 Ok(Self(currency))
45 }
46}
47
48impl<'r> FromRow<'r, PgRow> for SignalModel {
49 fn from_row(row: &'r PgRow) -> Result<Self, sqlx::Error> {
50 let name = row.try_get::<&str, _>("name").map(Ustr::from)?;
51 let value = row.try_get::<String, _>("value")?;
52 let ts_event = row.try_get::<&str, _>("ts_event").map(UnixNanos::from)?;
53 let ts_init = row.try_get::<&str, _>("ts_init").map(UnixNanos::from)?;
54 let signal = Signal::new(name, value, ts_event, ts_init);
55 Ok(Self(signal))
56 }
57}