#protobuf #parser #directory #quick-protobuf

no-std bin+lib pb-rs

从 proto 文件转换为与 quick-protobuf 兼容的 Rust 模块的转换器

14 个版本 (8 个重大更改)

0.10.0 2022 年 11 月 22 日
0.9.1 2020 年 9 月 26 日
0.9.0 2020 年 5 月 17 日
0.8.3 2019 年 11 月 20 日
0.2.0 2018 年 2 月 1 日

#1244编码

Download history 1031/week @ 2024-03-13 880/week @ 2024-03-20 772/week @ 2024-03-27 941/week @ 2024-04-03 590/week @ 2024-04-10 852/week @ 2024-04-17 740/week @ 2024-04-24 666/week @ 2024-05-01 672/week @ 2024-05-08 773/week @ 2024-05-15 756/week @ 2024-05-22 659/week @ 2024-05-29 678/week @ 2024-06-05 1178/week @ 2024-06-12 1205/week @ 2024-06-19 1531/week @ 2024-06-26

每月下载量 4,771
5 软件包中(3 个直接使用)

MIT 许可证

150KB
4K SLoC

pb-rs

一个简单的将 .proto 文件转换为 Rust quick-protobuf 兼容模块的转换器。

用法

pb-rs <file.proto>

pb-rs 也可以作为一个软件包(例如在你的 cargo build 脚本中)使用

Cargo.toml:

[dependencies]
quick-protobuf = "0.8.0"

[build-dependencies]
pb-rs = "0.9.1"

build.rs:

use pb_rs::{types::FileDescriptor, ConfigBuilder};
use std::path::{Path, PathBuf};
use walkdir::WalkDir;

fn main() {
    let out_dir = std::env::var("OUT_DIR").unwrap();
    let out_dir = Path::new(&out_dir).join("protos");

    let in_dir = PathBuf::from(::std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("protos");
    // Re-run this build.rs if the protos dir changes (i.e. a new file is added)
    println!("cargo:rerun-if-changed={}", in_dir.to_str().unwrap());

    // Find all *.proto files in the `in_dir` and add them to the list of files
    let mut protos = Vec::new();
    let proto_ext = Some(Path::new("proto").as_os_str());
    for entry in WalkDir::new(&in_dir) {
        let path = entry.unwrap().into_path();
        if path.extension() == proto_ext {
            // Re-run this build.rs if any of the files in the protos dir change
            println!("cargo:rerun-if-changed={}", path.to_str().unwrap());
            protos.push(path);
        }
    }

    // Delete all old generated files before re-generating new ones
    if out_dir.exists() {
        std::fs::remove_dir_all(&out_dir).unwrap();
    }
    std::fs::DirBuilder::new().create(&out_dir).unwrap();
    let config_builder = ConfigBuilder::new(&protos, None, Some(&out_dir), &[in_dir]).unwrap();
    FileDescriptor::run(&config_builder.build()).unwrap()
}

main.rslib.rs

mod hello {
    include_bytes!(concat!(env!("OUT_DIR")), "/hello.rs");
}

依赖项

~1–9MB
~70K SLoC