1use 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}