use super::config::BoxConfig;
use super::state::BoxState;
use crate::runtime::layout::dirs;
use crate::runtime::types::PublishedPort;
use crate::util::{PidFileReader, PidRecord, ProcessIdentity};
#[derive(Clone)]
pub(crate) struct LivePublishedPorts {
lifecycle: PidRecord,
bindings: Vec<PublishedPort>,
}
impl LivePublishedPorts {
pub(crate) fn new(lifecycle: PidRecord, bindings: Vec<PublishedPort>) -> Self {
Self {
lifecycle,
bindings,
}
}
pub(crate) fn bindings_for(&self, lifecycle: PidRecord) -> Option<&[PublishedPort]> {
(self.lifecycle == lifecycle).then_some(&self.bindings)
}
}
pub(crate) fn resolved_from_state(
config: &BoxConfig,
state: &BoxState,
) -> Option<Vec<PublishedPort>> {
use crate::BoxStatus::{Configured, Failed, Paused, Running, Stopped, Stopping, Unknown};
if config.options.ports.is_empty() {
return Some(Vec::new());
}
match state.status {
Configured | Stopped | Failed => {
let pid_file = PidFileReader::at(config.box_home.join(dirs::SHIM_PID_FILE));
(pid_file.process_identity() == ProcessIdentity::Absent).then(Vec::new)
}
Running | Paused | Stopping | Unknown => None,
}
}