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