pub use connection::Connection;
pub use consumer::{Consumer, ConsumerBuilder};
pub use error::{Result, RustRabbitError};
pub use message::{
ErrorRecord, ErrorType, MassTransitEnvelope, MessageEnvelope, MessageMetadata, MessageSource,
WireMessage,
};
pub use publisher::{MassTransitOptions, PublishOptions, Publisher};
pub use retry::{DelayStrategy, RetryConfig, RetryMechanism};
mod connection;
mod consumer;
mod error;
mod message;
mod publisher;
mod retry;
#[cfg(feature = "tracing")]
pub fn init_tracing() {
use tracing_subscriber::EnvFilter;
let filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info,lapin=warn"));
tracing_subscriber::fmt().with_env_filter(filter).init();
}
pub mod prelude {
pub use crate::{
Connection, Consumer, ConsumerBuilder, DelayStrategy, ErrorRecord, ErrorType,
MassTransitEnvelope, MassTransitOptions, MessageEnvelope, MessageMetadata, MessageSource,
PublishOptions, Publisher, Result, RetryConfig, RetryMechanism, RustRabbitError,
WireMessage,
};
#[cfg(feature = "tracing")]
pub use crate::init_tracing;
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[allow(dead_code)]
struct TestMessage {
id: u32,
content: String,
}
#[tokio::test]
async fn test_api_compilation() {
let _connection_result = Connection::new("amqp://localhost:5672").await;
let _exponential = RetryConfig::exponential_default();
let _linear = RetryConfig::linear(3, Duration::from_secs(5));
let _custom = RetryConfig::custom(vec![Duration::from_secs(1), Duration::from_secs(5)]);
let _no_retry = RetryConfig::no_retry();
}
#[test]
fn test_basic_api_exists() {
use crate::prelude::*;
let _: Option<Connection> = None;
let _: Option<Publisher> = None;
let _: Option<Consumer> = None;
let _: Option<RetryConfig> = None;
let _retry = RetryConfig::exponential_default();
let _options = PublishOptions::new();
}
#[test]
fn test_retry_config_calculations() {
let config = RetryConfig::exponential(5, Duration::from_secs(1), Duration::from_secs(30));
assert_eq!(config.calculate_delay(0), Some(Duration::from_secs(1)));
assert_eq!(config.calculate_delay(1), Some(Duration::from_secs(2)));
assert_eq!(config.calculate_delay(2), Some(Duration::from_secs(4)));
assert_eq!(config.calculate_delay(3), Some(Duration::from_secs(8)));
assert_eq!(config.calculate_delay(4), Some(Duration::from_secs(16)));
assert_eq!(config.calculate_delay(5), None);
}
#[test]
fn test_retry_config_linear() {
let config = RetryConfig::linear(3, Duration::from_secs(5));
assert_eq!(config.max_retries, 3);
assert_eq!(config.calculate_delay(0), Some(Duration::from_secs(5)));
assert_eq!(config.calculate_delay(1), Some(Duration::from_secs(5)));
assert_eq!(config.calculate_delay(2), Some(Duration::from_secs(5)));
assert_eq!(config.calculate_delay(3), None); }
#[test]
fn test_retry_config_custom() {
let delays = vec![
Duration::from_secs(1),
Duration::from_secs(3),
Duration::from_secs(7),
];
let config = RetryConfig::custom(delays.clone());
assert_eq!(config.max_retries, 3);
assert_eq!(config.calculate_delay(0), Some(Duration::from_secs(1)));
assert_eq!(config.calculate_delay(1), Some(Duration::from_secs(3)));
assert_eq!(config.calculate_delay(2), Some(Duration::from_secs(7)));
assert_eq!(config.calculate_delay(3), None); }
#[test]
fn test_publish_options() {
let options = PublishOptions::new()
.mandatory()
.with_expiration("60000")
.with_priority(5);
assert!(options.mandatory);
assert_eq!(options.expiration, Some("60000".to_string()));
assert_eq!(options.priority, Some(5));
}
}