nautilus_common/
signal.rs1use std::{any::Any, sync::Arc};
19
20use nautilus_core::UnixNanos;
21use nautilus_model::data::{HasTsInit, custom::CustomDataTrait};
22use serde::{Deserialize, Serialize};
23use ustr::Ustr;
24
25#[repr(C)]
27#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
28#[cfg_attr(
29 feature = "python",
30 pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.common", from_py_object)
31)]
32#[cfg_attr(
33 feature = "python",
34 pyo3_stub_gen::derive::gen_stub_pyclass(module = "nautilus_trader.common")
35)]
36pub struct Signal {
37 pub name: Ustr,
38 pub value: String,
39 pub ts_event: UnixNanos,
40 pub ts_init: UnixNanos,
41}
42
43impl Signal {
44 #[must_use]
46 pub const fn new(name: Ustr, value: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self {
47 Self {
48 name,
49 value,
50 ts_event,
51 ts_init,
52 }
53 }
54}
55
56impl HasTsInit for Signal {
57 fn ts_init(&self) -> UnixNanos {
58 self.ts_init
59 }
60}
61
62impl CustomDataTrait for Signal {
63 fn type_name(&self) -> &'static str {
64 "Signal"
65 }
66
67 fn as_any(&self) -> &dyn Any {
68 self
69 }
70
71 fn ts_event(&self) -> UnixNanos {
72 self.ts_event
73 }
74
75 fn to_json(&self) -> anyhow::Result<String> {
76 Ok(serde_json::to_string(self)?)
77 }
78
79 fn clone_arc(&self) -> Arc<dyn CustomDataTrait> {
80 Arc::new(self.clone())
81 }
82
83 fn eq_arc(&self, other: &dyn CustomDataTrait) -> bool {
84 other
85 .as_any()
86 .downcast_ref::<Self>()
87 .is_some_and(|o| self == o)
88 }
89
90 #[cfg(feature = "python")]
91 fn to_pyobject(&self, py: pyo3::Python<'_>) -> pyo3::PyResult<pyo3::Py<pyo3::PyAny>> {
92 use pyo3::IntoPyObjectExt;
93 self.clone().into_py_any(py)
94 }
95}