use crate::{client::SdkClient, target::TargetProxy};
use rship_entities::emitter::Emitter;
use schemars::{schema_for, JsonSchema};
use serde::Serialize;
use serde_json::json;
#[derive(Clone)]
pub struct EmitterArgs<T: JsonSchema + Clone> {
phantom: std::marker::PhantomData<T>,
pub name: String,
pub short_id: String,
}
impl<T: JsonSchema + Clone> EmitterArgs<T> {
pub fn new(name: String, short_id: String) -> Self {
Self {
phantom: std::marker::PhantomData,
name,
short_id,
}
}
}
pub struct EmitterProxy<T: JsonSchema + Serialize + Clone> {
pub(crate) target: TargetProxy,
pub(crate) args: EmitterArgs<T>,
pub(crate) client: SdkClient,
}
impl<T: JsonSchema + Serialize + Clone> EmitterProxy<T> {
pub async fn save(&self) {
let emitter = Emitter::new(
self.id(),
self.args.name.clone(),
self.target.id(),
self.target.instance.args.service_id.clone(),
json!(schema_for!(T)),
);
if let Err(e) = self.client.save_item(&emitter).await {
log::error!("Could not save emitter: {}", e);
}
}
pub fn id(&self) -> String {
format!(
"{}:{}:{}",
self.target.instance.args.service_id, self.target.args.short_id, self.args.short_id
)
}
pub async fn pulse(&self, data: T) -> Result<(), String> {
self.client
.pulse_emitter(
self.target.instance.args.service_id.clone(),
self.target.args.short_id.clone(),
self.args.short_id.clone(),
data,
)
.await
}
}