containerd 0.1.0

containerd sdk
Documentation
use std::collections::HashMap;
use std::ffi::OsStr;
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;
use walkdir::WalkDir;

fn main() {
    let mut replace_pairs = HashMap::new();
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/descriptor.proto",
        "api/types/descriptor.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/mount.proto",
        "api/types/mount.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/platform.proto",
        "api/types/platform.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/metrics.proto",
        "api/types/metrics.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/descriptor.proto",
        "api/types/descriptor.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/api/types/task/task.proto",
        "api/types/task/task.proto",
    );
    replace_pairs.insert(
        "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto",
        "protobuf/plugin/fieldpath.proto",
    );

    walkdir_replace(&replace_pairs, false).unwrap();
    replace_text_in_file(
        "containerd/api/services/introspection/v1/introspection.proto",
        "repeated types.Platform platforms = 4 [(gogoproto.nullable) = false];",
        "repeated containerd.types.Platform platforms = 4 [(gogoproto.nullable) = false];",
    )
    .unwrap();
    replace_text_in_file(
        "containerd/api/services/tasks/v1/tasks.proto",
        "repeated types.Metric metrics = 1;",
        "repeated containerd.types.Metric metrics = 1;",
    )
    .unwrap();
    tonic_build::configure()
        .out_dir("./src/apis")
        .build_server(false)
        .build_client(true)
        .compile(
            &[
                "containerd/api/services/images/v1/images.proto",
                "containerd/api/services/containers/v1/containers.proto",
                "containerd/api/services/content/v1/content.proto",
                "containerd/api/services/diff/v1/diff.proto",
                "containerd/api/services/events/v1/events.proto",
                "containerd/api/services/images/v1/images.proto",
                "containerd/api/services/introspection/v1/introspection.proto",
                "containerd/api/services/leases/v1/leases.proto",
                "containerd/api/services/namespaces/v1/namespace.proto",
                "containerd/api/services/snapshots/v1/snapshots.proto",
                "containerd/api/services/tasks/v1/tasks.proto",
                "containerd/api/services/version/v1/version.proto",
                "containerd/api/types/descriptor.proto",
                "containerd/api/types/metrics.proto",
                "containerd/api/types/mount.proto",
                "containerd/api/types/platform.proto",
                "containerd/api/types/task/task.proto",
                "containerd/protobuf/plugin/fieldpath.proto",
                "protobuf/protobuf/google/protobuf/empty.proto",
                "protobuf/protobuf/google/protobuf/timestamp.proto",
                "protobuf/protobuf/google/protobuf/field_mask.proto",
                "protobuf/protobuf/google/protobuf/any.proto",
                "googleapis/google/rpc/status.proto",
                "protobuf/gogoproto/gogo.proto",
            ],
            &[
                "protobuf/protobuf",
                "protobuf",
                "containerd/api/services/images/v1",
                "googleapis",
                "containerd",
            ],
        )
        .unwrap();
    walkdir_replace(&replace_pairs, true).unwrap();
    replace_text_in_file(
        "containerd/api/services/introspection/v1/introspection.proto",
        "repeated containerd.types.Platform platforms = 4 [(gogoproto.nullable) = false];",
        "repeated types.Platform platforms = 4 [(gogoproto.nullable) = false];",
    )
    .unwrap();
    replace_text_in_file(
        "containerd/api/services/tasks/v1/tasks.proto",
        "repeated containerd.types.Metric metrics = 1;",
        "repeated types.Metric metrics = 1;",
    )
    .unwrap();
}

fn replace_text_in_file(file_name: &str, from: &str, to: &str) -> Result<(), std::io::Error> {
    let mut src = File::open(file_name)?;
    let mut contents = String::new();
    src.read_to_string(&mut contents).unwrap();
    drop(src);

    let new_contents = contents.replace(from, to);

    let mut dst = File::create(&file_name)?;
    dst.write(new_contents.as_bytes())?;

    Ok(())
}

fn walkdir_replace(map: &HashMap<&str, &str>, back: bool) -> Result<(), std::io::Error> {
    for entry in WalkDir::new("./containerd/api/services/")
        .into_iter()
        .filter_map(Result::ok)
        .filter(|e| !e.file_type().is_dir())
    {
        let f_name = String::from(entry.file_name().to_string_lossy());
        let ext = Path::new(&f_name).extension().and_then(OsStr::to_str);
        if ext == Some("proto") {
            for (key, value) in map {
                if back {
                    replace_text_in_file(entry.path().to_str().unwrap(), value, key).unwrap();
                } else {
                    replace_text_in_file(entry.path().to_str().unwrap(), key, value).unwrap();
                }
            }
        }
    }
    Ok(())
}