rectangle_device_sandbox/
runtime.rs

1use crate::types::{ImageDigest, SandboxError};
2use async_process::{Command, Stdio};
3use std::error::Error;
4
5pub fn command() -> Command {
6    Command::new("podman")
7}
8
9pub async fn image_exists(id: &ImageDigest) -> Result<bool, Box<dyn Error>> {
10    let mut command = command();
11    Ok(command
12        .arg("image").arg("exists")
13        .arg(id.digest.as_str())
14        .status().await?.success())
15}
16
17pub async fn pull(id: &ImageDigest) -> Result<(), Box<dyn Error>> {
18    let mut command = command();
19    let digest = String::from_utf8(
20        command
21            .arg("pull")
22            .arg(id.image.as_str())
23            .stderr(Stdio::inherit())
24            .output().await?.stdout)?;
25
26    let digest = digest.trim();
27    if digest == id.digest.as_str() {
28        Ok(())
29    } else {
30        Err(Box::new(SandboxError::UnexpectedDigest(digest.to_string())))
31    }
32}