amq_protocol_codegen/
specs.rs1use crate::internal::*;
2
3use amq_protocol_types::*;
4use serde::{Deserialize, Serialize};
5use serde_json::{from_str, Value};
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}