wslc 0.1.7

Safe Rust wrapper for Microsoft WSL Containers
use std::time::Duration;

use wslc::{
    ContainerOptions, DeleteContainerOptions, ImagePullOptions, ProcessOptions, Service, Session,
    Signal,
};

mod common;

const ALPINE_IMAGE: &str = "docker.io/library/alpine:latest";

fn main() -> wslc::Result<()> {
    Service::ensure_available()?;

    let name = common::unique_name("hello-wslc-rs");
    let session = Session::builder(&name, common::storage_path(&name))
        .cpu_count(2)
        .memory_mb(2048)
        .start()?;

    session
        .pull_image(ImagePullOptions::new(ALPINE_IMAGE))
        .on_progress(|p| {
            println!("pull: {:?} {}/{}", p.status, p.current_bytes, p.total_bytes);
        })
        .run()?;

    let process = ProcessOptions::new(["/bin/echo", "hello from wslc-rs"])
        .capture_stdout()
        .capture_stderr();

    let container = session
        .container(ContainerOptions::new(ALPINE_IMAGE))
        .name(name)
        .init_process(process)
        .auto_remove(true)
        .create()?;

    let output = container.start_and_wait()?;
    println!("status: {}", output.status);
    println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
    eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr));

    container
        .stop(Signal::Sigterm, Duration::from_secs(10))
        .ok();
    container.delete(DeleteContainerOptions::default()).ok();
    session.terminate()?;

    Ok(())
}