use crate::{client::SdkClient, target::TargetProxy};
use rship_entities::action::Action;
use schemars::{schema_for, JsonSchema};
use serde::de::DeserializeOwned;
use serde_json::json;
#[derive(Clone)]
pub struct ActionArgs<T: DeserializeOwned + JsonSchema> {
phantom: std::marker::PhantomData<T>,
pub name: String,
pub short_id: String,
}
impl<T: DeserializeOwned + JsonSchema> ActionArgs<T> {
pub fn new(name: String, short_id: String) -> Self {
Self {
phantom: std::marker::PhantomData,
name,
short_id,
}
}
}
pub struct ActionProxy<T: DeserializeOwned + JsonSchema> {
pub(crate) target: TargetProxy,
pub(crate) args: ActionArgs<T>,
pub(crate) client: SdkClient,
}
impl<T: DeserializeOwned + JsonSchema> ActionProxy<T> {
pub async fn save(&self) {
let action = Action::new(
self.id(),
self.target.id(),
self.target.instance.args.service_id.clone(),
self.args.name.clone(),
json!(schema_for!(T)),
);
if self.client.save_item(&action).await.is_err() {
println!("Could not save action");
}
}
pub fn id(&self) -> String {
format!(
"{}:{}:{}",
self.target.instance.args.service_id, self.target.args.short_id, self.args.short_id
)
}
}