//! Native plugin futures and their process context. use crate::{Host, RpcResult}; use serde_json::{Value, json}; use std::{future::Future, pin::Pin, sync::Arc}; use uuid::Uuid; /// The cancellable future of a native process. pub type NativeFuture = Pin + Send>>; /// A handler for the methods of one native plugin. pub type NativePlugin = Arc NativeFuture + Send + Sync>; #[derive(Clone)] /// The process identity and host access supplied to a native handler. pub struct NativeContext { /// The host that owns this native process. pub host: Host, /// The ID assigned to this native process. pub pid: String, } impl NativeContext { /// Make an outgoing call with this native process as its caller. pub async fn call(&self, method: &str, params: Value) -> RpcResult { self.host .route( self.pid.clone(), Some(json!(Uuid::now_v7().to_string())), method.into(), params, false, ) .await } /// Send progress to this process's caller while its call remains unanswered. pub fn notify(&self, name: &str, params: Value) { self.host.notify(&self.pid, name, params); } }