1use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "lowercase")]
10pub enum ProcedureType {
11 Query,
12 Command,
13 Subscription,
14}
15
16impl std::fmt::Display for ProcedureType {
17 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18 match self {
19 Self::Query => write!(f, "query"),
20 Self::Command => write!(f, "command"),
21 Self::Subscription => write!(f, "subscription"),
22 }
23 }
24}
25
26#[derive(Debug, Serialize, Deserialize)]
27pub struct Manifest {
28 pub version: u32,
29 pub procedures: BTreeMap<String, ProcedureSchema>,
30 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
31 pub channels: BTreeMap<String, ChannelSchema>,
32}
33
34#[derive(Debug, Serialize, Deserialize)]
35pub struct ProcedureSchema {
36 #[serde(rename = "type")]
37 pub proc_type: ProcedureType,
38 pub input: Value,
39 pub output: Value,
40 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub error: Option<Value>,
42}
43
44#[derive(Debug, Serialize, Deserialize)]
45pub struct ChannelSchema {
46 pub input: Value,
47 pub incoming: BTreeMap<String, IncomingSchema>,
48 pub outgoing: BTreeMap<String, Value>,
49}
50
51#[derive(Debug, Serialize, Deserialize)]
52pub struct IncomingSchema {
53 pub input: Value,
54 pub output: Value,
55 #[serde(default, skip_serializing_if = "Option::is_none")]
56 pub error: Option<Value>,
57}