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 =
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}