use crate::error::{ComposeError, Result};
use crate::libpod::{urlencoded, API_PREFIX};
impl super::super::Engine {
pub(super) async fn run_attached(&self, container_name: &str) -> Result<i64> {
let attach_path = format!(
"{API_PREFIX}/containers/{}/attach?stream=1&stdin=1&stdout=1&stderr=1",
urlencoded(container_name),
);
let hijacked = self
.client
.post_hijack(&attach_path, b"")
.await
.map_err(ComposeError::Podman)?;
let start_path = format!(
"{API_PREFIX}/containers/{}/start",
urlencoded(container_name),
);
self.client
.post_empty_ok(&start_path)
.await
.map_err(ComposeError::Podman)?;
self.pump_terminal(
hijacked,
&format!("containers/{}", urlencoded(container_name)),
)
.await?;
let wait_path = format!(
"{API_PREFIX}/containers/{}/wait?condition=stopped",
urlencoded(container_name),
);
self.client
.post_empty_json_unbounded::<i64>(&wait_path)
.await
.map_err(ComposeError::Podman)
}
}
impl super::super::Engine {
pub(super) async fn finish_interactive_run(
&self,
run_name: &str,
rm: bool,
rm_path: &str,
) -> Result<()> {
let outcome = self.run_attached(run_name).await;
if rm {
let _ = self.client.delete_ok(rm_path).await;
}
match outcome? {
0 => Ok(()),
code => Err(ComposeError::RunExited(code)),
}
}
}