nautilus_okx/
factories.rs1use std::{any::Any, cell::RefCell, rc::Rc};
19
20use nautilus_common::{cache::Cache, clock::Clock};
21use nautilus_data::client::DataClient;
22use nautilus_model::identifiers::ClientId;
23use nautilus_system::factories::{ClientConfig, DataClientFactory};
24
25use crate::{config::OKXDataClientConfig, data::OKXDataClient};
26
27impl ClientConfig for OKXDataClientConfig {
28 fn as_any(&self) -> &dyn Any {
29 self
30 }
31}
32
33#[derive(Debug)]
35pub struct OKXDataClientFactory;
36
37impl OKXDataClientFactory {
38 #[must_use]
40 pub const fn new() -> Self {
41 Self
42 }
43}
44
45impl Default for OKXDataClientFactory {
46 fn default() -> Self {
47 Self::new()
48 }
49}
50
51impl DataClientFactory for OKXDataClientFactory {
52 fn create(
53 &self,
54 name: &str,
55 config: &dyn ClientConfig,
56 _cache: Rc<RefCell<Cache>>,
57 _clock: Rc<RefCell<dyn Clock>>,
58 ) -> anyhow::Result<Box<dyn DataClient>> {
59 let okx_config = config
60 .as_any()
61 .downcast_ref::<OKXDataClientConfig>()
62 .ok_or_else(|| {
63 anyhow::anyhow!(
64 "Invalid config type for OKXDataClientFactory. Expected OKXDataClientConfig, was {config:?}",
65 )
66 })?
67 .clone();
68
69 let client_id = ClientId::from(name);
70 let client = OKXDataClient::new(client_id, okx_config)?;
71 Ok(Box::new(client))
72 }
73
74 fn name(&self) -> &'static str {
75 "OKX"
76 }
77
78 fn config_type(&self) -> &'static str {
79 "OKXDataClientConfig"
80 }
81}
82
83