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 pub fn load(metadata: Option<Value>) -> AMQProtocolDefinition {
41 let specs = include_str!(concat!(
42 env!("CARGO_MANIFEST_DIR"),
43 "/specs/amqp-rabbitmq-0.9.1.json"
44 ));
45
46 from_str::<_AMQProtocolDefinition>(specs)
47 .expect("Failed to parse AMQP specs file")
48 .into_specs(&metadata.unwrap_or_default())
49 }
50}
51
52#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
54pub struct AMQPConstant {
55 pub name: String,
57 pub value: LongUInt,
59 #[serde(rename = "type")]
61 pub amqp_type: AMQPType,
62}
63
64#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
66pub struct AMQPClass {
67 pub id: Identifier,
69 pub methods: Vec<AMQPMethod>,
71 pub name: String,
73 pub properties: Vec<AMQPProperty>,
75 pub metadata: Value,
77}
78
79#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
81pub struct AMQPMethod {
82 pub id: Identifier,
84 pub arguments: Vec<AMQPArgument>,
86 pub name: String,
88 pub synchronous: Boolean,
90 pub content: Boolean,
92 pub metadata: Value,
94 pub is_reply: bool,
96 pub ignore_args: bool,
98 pub c2s: bool,
100 pub s2c: bool,
102}
103
104#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
106pub enum AMQPArgument {
107 Value(AMQPValueArgument),
109 Flags(AMQPFlagsArgument),
111}
112
113impl AMQPArgument {
114 pub(crate) fn force_default(&self) -> bool {
115 match self {
116 AMQPArgument::Value(v) => v.force_default,
117 AMQPArgument::Flags(f) => f.force_default(),
118 }
119 }
120}
121
122#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
124pub struct AMQPValueArgument {
125 #[serde(rename = "type")]
127 pub amqp_type: AMQPType,
128 pub name: String,
130 pub default_value: Option<AMQPValue>,
132 pub domain: Option<String>,
134 pub force_default: bool,
136}
137
138#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
140pub struct AMQPFlagsArgument {
141 pub ignore_flags: bool,
143 pub flags: Vec<AMQPFlagArgument>,
145}
146
147impl AMQPFlagsArgument {
148 pub(crate) fn force_default(&self) -> bool {
149 self.flags.iter().all(|f| f.force_default)
150 }
151}
152
153#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
155pub struct AMQPFlagArgument {
156 pub name: String,
158 pub default_value: Boolean,
160 pub force_default: bool,
162}
163
164#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
166pub struct AMQPProperty {
167 #[serde(rename = "type")]
169 pub amqp_type: AMQPType,
170 pub name: String,
172}