use crate::internal::*;
use amq_protocol_types::*;
use serde::{Deserialize, Serialize};
use serde_json::{Value, from_str};
use std::collections::BTreeMap;
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQProtocolDefinition {
pub name: String,
pub major_version: ShortShortUInt,
pub minor_version: ShortShortUInt,
pub revision: ShortShortUInt,
pub port: LongUInt,
pub copyright: String,
pub domains: BTreeMap<String, AMQPType>,
pub constants: Vec<AMQPConstant>,
pub soft_errors: Vec<AMQPConstant>,
pub hard_errors: Vec<AMQPConstant>,
pub classes: Vec<AMQPClass>,
}
impl AMQProtocolDefinition {
pub fn load(metadata: Option<Value>) -> AMQProtocolDefinition {
let specs = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/specs/amqp-rabbitmq-0.9.1.json"
));
from_str::<_AMQProtocolDefinition>(specs)
.expect("Failed to parse AMQP specs file")
.into_specs(&metadata.unwrap_or_default())
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPConstant {
pub name: String,
pub value: LongUInt,
#[serde(rename = "type")]
pub amqp_type: AMQPType,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPClass {
pub id: Identifier,
pub methods: Vec<AMQPMethod>,
pub name: String,
pub properties: Vec<AMQPProperty>,
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPMethod {
pub id: Identifier,
pub arguments: Vec<AMQPArgument>,
pub name: String,
pub synchronous: Boolean,
pub content: Boolean,
pub metadata: Value,
pub is_reply: bool,
pub ignore_args: bool,
pub c2s: bool,
pub s2c: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub enum AMQPArgument {
Value(AMQPValueArgument),
Flags(AMQPFlagsArgument),
}
impl AMQPArgument {
pub(crate) fn force_default(&self) -> bool {
match self {
AMQPArgument::Value(v) => v.force_default,
AMQPArgument::Flags(f) => f.force_default(),
}
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPValueArgument {
#[serde(rename = "type")]
pub amqp_type: AMQPType,
pub name: String,
pub default_value: Option<AMQPValue>,
pub domain: Option<String>,
pub force_default: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPFlagsArgument {
pub ignore_flags: bool,
pub flags: Vec<AMQPFlagArgument>,
}
impl AMQPFlagsArgument {
pub(crate) fn force_default(&self) -> bool {
self.flags.iter().all(|f| f.force_default)
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPFlagArgument {
pub name: String,
pub default_value: Boolean,
pub force_default: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPProperty {
#[serde(rename = "type")]
pub amqp_type: AMQPType,
pub name: String,
}