use std::time::Duration;
use crate::{
Container, ExposedPort, ImageName, Port, PortError, RunnableContainer,
RunnableContainerBuilder, ToRunnableContainer, WaitStrategy,
};
const MOSQUITTO_IMAGE: &ImageName = &ImageName::new("docker.io/eclipse-mosquitto");
const PORT: Port = Port(6379);
#[derive(Debug)]
pub struct Mosquitto {
image: ImageName,
port: ExposedPort,
}
impl Mosquitto {
#[must_use]
pub fn with_tag(self, tag: impl Into<String>) -> Self {
let Self { mut image, .. } = self;
image.set_tag(tag);
Self { image, ..self }
}
#[must_use]
pub fn with_digest(self, digest: impl Into<String>) -> Self {
let Self { mut image, .. } = self;
image.set_digest(digest);
Self { image, ..self }
}
#[must_use]
pub fn with_port(mut self, port: ExposedPort) -> Self {
self.port = port;
self
}
}
impl Container<Mosquitto> {
pub async fn endpoint(&self) -> Result<String, PortError> {
let port = self.port.host_port().await?;
let host_ip = self.runner.container_host_ip().await?;
let url = format!("mqtt://{host_ip}:{port}");
Ok(url)
}
}
impl Default for Mosquitto {
fn default() -> Self {
Self {
image: MOSQUITTO_IMAGE.clone(),
port: ExposedPort::new(PORT),
}
}
}
impl ToRunnableContainer for Mosquitto {
fn to_runnable(&self, builder: RunnableContainerBuilder) -> RunnableContainer {
builder
.with_image(self.image.clone())
.with_command(["mosquitto", "-c", "/mosquitto-no-auth.conf"])
.with_wait_strategy(WaitStrategy::ScanPort {
container_port: PORT,
timeout: Duration::from_secs(10),
})
.with_port_mappings([self.port.clone()])
.build()
}
}