1use crate::internal::*;
2
3use amq_protocol_types::*;
4use serde::{Deserialize, Serialize};
5use serde_json::{Value, from_str};
6
7use std::collections::BTreeMap;
8
9#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
11pub struct AMQProtocolDefinition {
12 pub name: String,
14 pub major_version: ShortShortUInt,
16 pub minor_version: ShortShortUInt,
18 pub revision: ShortShortUInt,
20 pub port: LongUInt,
22 pub copyright: String,
24 pub domains: BTreeMap<String, AMQPType>,
26 pub constants: Vec<AMQPConstant>,
28 pub soft_errors: Vec<AMQPConstant>,
30 pub hard_errors: Vec<AMQPConstant>,
32 pub classes: Vec<AMQPClass>,
34 pub metadata: Value,
36}
37
38impl AMQProtocolDefinition {
39 #[must_use]
41 pub fn load(metadata: Option<Value>) -> AMQProtocolDefinition {
42 let specs = include_str!(concat!(
43 env!("CARGO_MANIFEST_DIR"),
44 "/specs/amqp-rabbitmq-0.9.1.json"
45 ));
46
47 from_str::<_AMQProtocolDefinition>(specs)
48 .expect("Failed to parse AMQP specs file")
49 .into_specs(&metadata.unwrap_or_default())
50 }
51}
52
53#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
55pub struct AMQPConstant {
56 pub name: String,
58 pub value: LongUInt,
60 #[serde(rename = "type")]
62 pub amqp_type: AMQPType,
63}
64
65#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
67pub struct AMQPClass {
68 pub id: Identifier,
70 pub methods: Vec<AMQPMethod>,
72 pub name: String,
74 pub properties: Vec<AMQPProperty>,
76 pub metadata: Value,
78}
79
80#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
82pub struct AMQPMethod {
83 pub id: Identifier,
85 pub arguments: Vec<AMQPArgument>,
87 pub name: String,
89 pub synchronous: Boolean,
91 pub content: Boolean,
93 pub metadata: Value,
95 pub is_reply: bool,
97 pub ignore_args: bool,
99 pub c2s: bool,
101 pub s2c: bool,
103}
104
105#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
107pub enum AMQPArgument {
108 Value(AMQPValueArgument),
110 Flags(AMQPFlagsArgument),
112}
113
114impl AMQPArgument {
115 pub(crate) fn force_default(&self) -> bool {
116 match self {
117 AMQPArgument::Value(v) => v.force_default,
118 AMQPArgument::Flags(f) => f.force_default(),
119 }
120 }
121}
122
123#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
125pub struct AMQPValueArgument {
126 #[serde(rename = "type")]
128 pub amqp_type: AMQPType,
129 pub name: String,
131 pub default_value: Option<AMQPValue>,
133 pub domain: Option<String>,
135 pub force_default: bool,
137}
138
139#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
141pub struct AMQPFlagsArgument {
142 pub ignore_flags: bool,
144 pub flags: Vec<AMQPFlagArgument>,
146}
147
148impl AMQPFlagsArgument {
149 pub(crate) fn force_default(&self) -> bool {
150 self.flags.iter().all(|f| f.force_default)
151 }
152}
153
154#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
156pub struct AMQPFlagArgument {
157 pub name: String,
159 pub default_value: Boolean,
161 pub force_default: bool,
163}
164
165#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
167pub struct AMQPProperty {
168 #[serde(rename = "type")]
170 pub amqp_type: AMQPType,
171 pub name: String,
173}