use ek_core::plugin::Plugin;
use ek_ctp::plugin::{CtpConfig, CtpPlugin};
use ek_dm::plugin::{DmConfig, DmPlugin};
use ek_oms::plugin::OmsPlugin;
#[derive(Clone)]
pub struct PlugKind {
pub name: &'static str,
pub doc: &'static str,
pub build: std::sync::Arc<dyn Fn() -> std::sync::Arc<dyn Plugin> + Send + Sync>,
}
#[must_use]
pub fn default_kinds() -> Vec<PlugKind> {
vec![
PlugKind {
name: "dm",
doc: "数据管理器(KlineManager;eTick.→eBar. 单源批)",
build: std::sync::Arc::new(|| {
std::sync::Arc::new(DmPlugin::new(DmConfig::minute("dm")))
}),
},
PlugKind {
name: "oms",
doc: "OMS 中枢(入账 + 查询 + 五段管线;地板三件 + ek-risk 三闸装配)",
build: std::sync::Arc::new(|| {
std::sync::Arc::new(
OmsPlugin::builder()
.risk_gates(ek_risk::standard_gates(&ek_risk::RiskLimits::default()))
.build(),
)
}),
},
PlugKind {
name: "ctp",
doc: "CTP 网关(native 关 = 纯逻辑驱动;账号经 {gw}.configure 手工注入,插件不读配置文件)",
build: std::sync::Arc::new(|| {
#[cfg(feature = "ctp-native")]
{
CtpPlugin::with_native(CtpConfig::default(), "target/ctp-flow")
}
#[cfg(not(feature = "ctp-native"))]
{
std::sync::Arc::new(CtpPlugin::new(CtpConfig::default()))
}
}),
},
]
}
pub struct DynPlugin {
inner: std::sync::Arc<dyn Plugin>,
}
impl DynPlugin {
pub fn wrap(inner: std::sync::Arc<dyn Plugin>) -> std::sync::Arc<Self> {
std::sync::Arc::new(Self { inner })
}
}
impl Plugin for DynPlugin {
fn name(&self) -> &str {
self.inner.name()
}
fn deps(&self) -> &[&str] {
self.inner.deps()
}
fn routes(&self) -> Vec<std::borrow::Cow<'static, str>> {
self.inner.routes()
}
fn mailbox_cap(&self) -> usize {
self.inner.mailbox_cap()
}
fn version(&self) -> std::borrow::Cow<'static, str> {
self.inner.version()
}
fn services(&self) -> Vec<ek_core::service::ServiceDesc> {
self.inner.services()
}
fn on_init(&self, ctx: &ek_core::context::PluginContext) {
self.inner.on_init(ctx);
}
fn on_start(&self) {
self.inner.on_start();
}
fn on_stop(&self) {
self.inner.on_stop();
}
fn on_mail(&self, event: &ek_event::Event) {
self.inner.on_mail(event);
}
}