use crate::internal::*;
use amq_protocol_types::*;
use serde::{Deserialize, Serialize};
use serde_json::{from_str, Value};
use std::collections::BTreeMap;
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQProtocolDefinition {
pub name: ShortString,
pub major_version: ShortShortUInt,
pub minor_version: ShortShortUInt,
pub revision: ShortShortUInt,
pub port: LongUInt,
pub copyright: LongString,
pub domains: BTreeMap<ShortString, 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: ShortString,
pub value: ShortUInt,
#[serde(rename="type")]
pub amqp_type: AMQPType,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPClass {
pub id: ShortUInt,
pub methods: Vec<AMQPMethod>,
pub name: ShortString,
pub properties: Vec<AMQPProperty>,
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPMethod {
pub id: ShortUInt,
pub arguments: Vec<AMQPArgument>,
pub name: ShortString,
pub synchronous: Boolean,
pub metadata: Value,
pub is_reply: bool,
pub ignore_args: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub enum AMQPArgument {
Value(AMQPValueArgument),
Flags(Vec<AMQPFlagArgument>),
}
impl AMQPArgument {
pub(crate) fn force_default(&self) -> bool {
match self {
AMQPArgument::Value(v) => v.force_default,
AMQPArgument::Flags(f) => f.iter().all(|f| f.force_default),
}
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPValueArgument {
#[serde(rename="type")]
pub amqp_type: AMQPType,
pub name: ShortString,
pub default_value: Option<AMQPValue>,
pub domain: Option<ShortString>,
pub force_default: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct AMQPFlagArgument {
pub name: ShortString,
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: ShortString,
}