use std::fmt::{self, Display};
use indexmap::IndexMap;
use typed_builder::TypedBuilder;
use crate::{ExposedPort, ImageReference, WaitStrategy};
#[derive(Debug, TypedBuilder)]
#[builder(field_defaults(setter(prefix = "with_")))]
#[non_exhaustive]
pub struct RunnableContainer {
#[builder(setter(into))]
pub(crate) image: ImageReference,
#[builder(default, setter(into))]
pub(crate) container_name: Option<String>,
#[builder(default, setter(transform = |args: impl IntoIterator<Item = impl Into<String>>| args.into_iter().map(Into::into).collect()))]
pub(crate) command: Vec<String>,
#[builder(default, setter(transform = |args: impl IntoIterator<Item = (impl Into<String>, impl Into<String>)>| args.into_iter().map(|(key, value)| (key.into(), value.into())).collect()))]
pub(crate) env: IndexMap<String, String>,
#[builder(default, setter(into))]
pub(crate) wait_strategy: WaitStrategy,
#[builder(default, setter(transform = |args: impl IntoIterator<Item = ExposedPort>| args.into_iter().collect()))]
pub(crate) port_mappings: Vec<ExposedPort>,
}
impl RunnableContainer {
#[must_use]
pub fn descriptor(&self) -> String {
self.image.to_string()
}
}
impl Display for RunnableContainer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.descriptor())
}
}
pub trait ToRunnableContainer {
fn to_runnable(&self, builder: RunnableContainerBuilder) -> RunnableContainer;
}