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 = Arc<
16  dyn Fn(serde_json::Value, serde_json::Value) -> BoxFuture<Result<serde_json::Value, SeamError>>
17    + Send
18    + Sync,
19>;
20
21pub type SubscriptionHandlerFn = Arc<
22  dyn Fn(
23      serde_json::Value,
24      serde_json::Value,
25    ) -> BoxFuture<Result<BoxStream<Result<serde_json::Value, SeamError>>, SeamError>>
26    + Send
27    + Sync,
28>;
29
30#[derive(Debug, Clone, Copy, PartialEq, Eq)]
31pub enum ProcedureType {
32  Query,
33  Command,
34}
35
36pub struct ProcedureDef {
37  pub name: String,
38  pub proc_type: ProcedureType,
39  pub input_schema: serde_json::Value,
40  pub output_schema: serde_json::Value,
41  pub error_schema: Option<serde_json::Value>,
42  pub context_keys: Vec<String>,
43  pub handler: HandlerFn,
44}
45
46pub struct SubscriptionDef {
47  pub name: String,
48  pub input_schema: serde_json::Value,
49  pub output_schema: serde_json::Value,
50  pub error_schema: Option<serde_json::Value>,
51  pub context_keys: Vec<String>,
52  pub handler: SubscriptionHandlerFn,
53}