use crate::portpicker;
pub type Port = u16;
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum PortVisibility {
#[default]
Exposed,
Published,
}
impl PortVisibility {
pub fn is_exposed(&self) -> bool {
matches!(*self, PortVisibility::Exposed)
}
pub fn is_published(&self) -> bool {
matches!(*self, PortVisibility::Published)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PortAccess {
port: Port,
public_port: Option<Port>,
visibility: PortVisibility,
}
impl PortAccess {
pub const fn new(port: Port, visibility: PortVisibility) -> Self {
Self {
port,
public_port: None,
visibility,
}
}
pub const fn exposed(port: Port) -> Self {
Self {
port,
public_port: None,
visibility: PortVisibility::Exposed,
}
}
pub const fn published(port: Port) -> Self {
Self {
port,
public_port: None,
visibility: PortVisibility::Published,
}
}
pub(crate) const fn published_with_fixed_public_port(port: Port, public_port: Port) -> Self {
Self {
port,
public_port: Some(public_port),
visibility: PortVisibility::Published,
}
}
pub const fn port(&self) -> Port {
self.port
}
pub(crate) fn public_port(&self) -> Option<Port> {
match self.visibility {
PortVisibility::Exposed => None,
PortVisibility::Published => self.public_port.or_else(portpicker::pick_unused_port),
}
}
pub const fn visibility(&self) -> PortVisibility {
self.visibility
}
}