1use std::future::Future;23use bifrostlink::declarative::endpoints;4use bifrostlink::Config;5use serde::{Deserialize, Serialize};67#[derive(Serialize, Deserialize, Debug, thiserror::Error)]8pub enum Error {9 #[error("plugin name must be a bare file name")]10 BadName,11 #[error("spawning plugin failed: {0}")]12 Spawn(String),13 #[error("failed to wait for connection, plugin process has died?")]14 ConnectionWaitError,15 #[error("agent is shutting down")]16 Gone,17}1819pub trait PluginHost: Send + Sync {20 fn load_plugin(&self, id: u16, name: String) -> impl Future<Output = Result<(), Error>> + Send;2122 fn load_plugin_path(23 &self,24 id: u16,25 path: String,26 ) -> impl Future<Output = Result<(), Error>> + Send;27}2829pub struct PluginEndpoints<H>(pub H);3031#[endpoints(ns = 9)]32impl<H: PluginHost + 'static> PluginEndpoints<H> {33 #[endpoints(id = 1)]34 async fn load_plugin(&self, id: u16, name: String) -> Result<(), Error> {35 self.0.load_plugin(id, name).await36 }37 #[endpoints(id = 2)]38 async fn load_plugin_path(&self, id: u16, path: String) -> Result<(), Error> {39 self.0.load_plugin_path(id, path).await40 }41}