Blank stdout lines give no warning. core.exit requests the exit in its own handler.
36 lines
1.3 KiB
Rust
36 lines
1.3 KiB
Rust
//! 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<Box<dyn Future<Output = RpcResult> + Send>>;
|
|
/// A handler for the methods of one native plugin.
|
|
pub type NativePlugin = Arc<dyn Fn(NativeContext, String, Value) -> 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);
|
|
}
|
|
}
|