Skip to main content

seam_server/
procedure.rs

1/* src/server/core/rust/src/procedure.rs */
2
3use std::future::Future;
4use std::pin::Pin;
5use std::sync::Arc;
6
7use futures_core::Stream;
8
9use crate::errors::SeamError;
10
11pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
12
13pub type BoxStream<T> = Pin<Box<dyn Stream<Item = T> + Send>>;
14
15pub type HandlerFn =
16  Arc<dyn Fn(serde_json::Value) -> BoxFuture<Result<serde_json::Value, SeamError>> + Send + Sync>;
17
18pub type SubscriptionHandlerFn = Arc<
19  dyn Fn(
20      serde_json::Value,
21    ) -> BoxFuture<Result<BoxStream<Result<serde_json::Value, SeamError>>, SeamError>>
22    + Send
23    + Sync,
24>;
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum ProcedureType {
28  Query,
29  Command,
30}
31
32pub struct ProcedureDef {
33  pub name: String,
34  pub proc_type: ProcedureType,
35  pub input_schema: serde_json::Value,
36  pub output_schema: serde_json::Value,
37  pub error_schema: Option<serde_json::Value>,
38  pub handler: HandlerFn,
39}
40
41pub struct SubscriptionDef {
42  pub name: String,
43  pub input_schema: serde_json::Value,
44  pub output_schema: serde_json::Value,
45  pub error_schema: Option<serde_json::Value>,
46  pub handler: SubscriptionHandlerFn,
47}