use std::sync::Arc;
use async_trait::async_trait;
use homecore::HomeCore;
use crate::error::PluginError;
use crate::manifest::PluginManifest;
use crate::plugin::{HomeCorePlugin, PluginId};
use crate::StateChangedEventJson;
pub struct LoadedPlugin {
pub id: PluginId,
pub manifest: PluginManifest,
pub(crate) instance: Arc<dyn HomeCorePlugin>,
}
impl LoadedPlugin {
pub async fn setup(&self, hc: HomeCore) -> Result<(), PluginError> {
self.instance.setup(hc).await
}
pub async fn unload(&self) -> Result<(), PluginError> {
self.instance.unload().await
}
pub async fn state_changed(&self, event: &StateChangedEventJson) -> Result<(), PluginError> {
self.instance.state_changed(event).await
}
}
#[async_trait]
pub trait PluginRuntime: Send + Sync + 'static {
async fn load(
&self,
id: PluginId,
manifest: PluginManifest,
plugin: Arc<dyn HomeCorePlugin>,
) -> Result<LoadedPlugin, PluginError>;
}
pub struct InProcessRuntime;
#[async_trait]
impl PluginRuntime for InProcessRuntime {
async fn load(
&self,
id: PluginId,
manifest: PluginManifest,
plugin: Arc<dyn HomeCorePlugin>,
) -> Result<LoadedPlugin, PluginError> {
Ok(LoadedPlugin {
id,
manifest,
instance: plugin,
})
}
}