Add support for custom proto paths
This commit is contained in:
parent
4f629e3421
commit
7aaa4ff88c
5 changed files with 52 additions and 14 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -290,7 +290,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nrpc-build"
|
name = "nrpc-build"
|
||||||
version = "0.6.0"
|
version = "0.7.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nrpc",
|
"nrpc",
|
||||||
"prettyplease 0.2.4",
|
"prettyplease 0.2.4",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "nrpc-build"
|
name = "nrpc-build"
|
||||||
version = "0.6.0"
|
version = "0.7.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
repository = "https://github.com/NGnius/nRPC"
|
repository = "https://github.com/NGnius/nRPC"
|
||||||
|
|
|
@ -21,6 +21,10 @@ impl<'a> Transpiler<'a> {
|
||||||
files: impl IntoIterator<Item = impl AsRef<Path>>,
|
files: impl IntoIterator<Item = impl AsRef<Path>>,
|
||||||
includes: impl IntoIterator<Item = impl AsRef<Path>>
|
includes: impl IntoIterator<Item = impl AsRef<Path>>
|
||||||
) -> Result<Self, impl std::error::Error> {
|
) -> Result<Self, impl std::error::Error> {
|
||||||
|
let files: Vec<_> = files.into_iter().collect();
|
||||||
|
for f in &files {
|
||||||
|
println!("cargo:rerun-if-changed={}", f.as_ref().display());
|
||||||
|
}
|
||||||
Ok::<_, protox::Error>(Self {
|
Ok::<_, protox::Error>(Self {
|
||||||
prost_config: Config::new(),
|
prost_config: Config::new(),
|
||||||
files: protox::compile(files, includes)?,
|
files: protox::compile(files, includes)?,
|
||||||
|
@ -31,19 +35,19 @@ impl<'a> Transpiler<'a> {
|
||||||
|
|
||||||
/// Generate client and server service implementations
|
/// Generate client and server service implementations
|
||||||
pub fn generate_all(mut self) -> Self {
|
pub fn generate_all(mut self) -> Self {
|
||||||
self.service_generator.add_service(super::ProtobufServiceGenerator::all());
|
self.service_generator.add_service(super::ProtobufServiceGenerator::all(std::env::var("OUT_DIR").unwrap().into()));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate server services implementations
|
/// Generate server services implementations
|
||||||
pub fn generate_server(mut self) -> Self {
|
pub fn generate_server(mut self) -> Self {
|
||||||
self.service_generator.add_service(super::ProtobufServiceGenerator::server());
|
self.service_generator.add_service(super::ProtobufServiceGenerator::server(std::env::var("OUT_DIR").unwrap().into()));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate client services implementations
|
/// Generate client services implementations
|
||||||
pub fn generate_client(mut self) -> Self {
|
pub fn generate_client(mut self) -> Self {
|
||||||
self.service_generator.add_service(super::ProtobufServiceGenerator::client());
|
self.service_generator.add_service(super::ProtobufServiceGenerator::client(std::env::var("OUT_DIR").unwrap().into()));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use prost_build::{Service, ServiceGenerator};
|
use prost_build::{Service, ServiceGenerator};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
|
|
||||||
|
@ -6,33 +8,41 @@ pub(crate) struct ProtobufServiceGenerator {
|
||||||
generate_client: bool,
|
generate_client: bool,
|
||||||
client_reexports: Vec<proc_macro2::TokenStream>,
|
client_reexports: Vec<proc_macro2::TokenStream>,
|
||||||
server_reexports: Vec<proc_macro2::TokenStream>,
|
server_reexports: Vec<proc_macro2::TokenStream>,
|
||||||
|
modules: Vec<String>,
|
||||||
|
out_dir: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ProtobufServiceGenerator {
|
impl ProtobufServiceGenerator {
|
||||||
pub fn all() -> Self {
|
pub fn all(out_dir: PathBuf) -> Self {
|
||||||
Self {
|
Self {
|
||||||
generate_server: true,
|
generate_server: true,
|
||||||
generate_client: true,
|
generate_client: true,
|
||||||
client_reexports: Vec::new(),
|
client_reexports: Vec::new(),
|
||||||
server_reexports: Vec::new(),
|
server_reexports: Vec::new(),
|
||||||
|
modules: Vec::new(),
|
||||||
|
out_dir: out_dir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn client() -> Self {
|
pub fn client(out_dir: PathBuf) -> Self {
|
||||||
Self {
|
Self {
|
||||||
generate_server: false,
|
generate_server: false,
|
||||||
generate_client: true,
|
generate_client: true,
|
||||||
client_reexports: Vec::new(),
|
client_reexports: Vec::new(),
|
||||||
server_reexports: Vec::new(),
|
server_reexports: Vec::new(),
|
||||||
|
modules: Vec::new(),
|
||||||
|
out_dir: out_dir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn server() -> Self {
|
pub fn server(out_dir: PathBuf) -> Self {
|
||||||
Self {
|
Self {
|
||||||
generate_server: true,
|
generate_server: true,
|
||||||
generate_client: false,
|
generate_client: false,
|
||||||
client_reexports: Vec::new(),
|
client_reexports: Vec::new(),
|
||||||
server_reexports: Vec::new(),
|
server_reexports: Vec::new(),
|
||||||
|
modules: Vec::new(),
|
||||||
|
out_dir: out_dir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,6 +135,24 @@ fn struct_methods_client(package_name: &str, service_name: &str, descriptors: &V
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_mod_rs(module_names: &Vec<String>, out_dir: &PathBuf) {
|
||||||
|
// generate mod.rs
|
||||||
|
let modules = module_names.iter().map(|m| {
|
||||||
|
let mod_ident = quote::format_ident!("{}", m);
|
||||||
|
quote! { pub mod #mod_ident; }
|
||||||
|
});
|
||||||
|
let gen_mods: syn::File = syn::parse2(quote! {
|
||||||
|
#(#modules)*
|
||||||
|
}).expect("invalid tokenstream");
|
||||||
|
let mod_str = prettyplease::unparse(&gen_mods);
|
||||||
|
std::fs::write(
|
||||||
|
out_dir
|
||||||
|
.join("mod.rs"),
|
||||||
|
&mod_str
|
||||||
|
).expect("Failed to write to $OUT_DIR/mod.rs");
|
||||||
|
//std::fs::write("/home/ngnius/potato.rs", &mod_str).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
impl ServiceGenerator for ProtobufServiceGenerator {
|
impl ServiceGenerator for ProtobufServiceGenerator {
|
||||||
fn generate(&mut self, service: Service, buf: &mut String) {
|
fn generate(&mut self, service: Service, buf: &mut String) {
|
||||||
if self.generate_server {
|
if self.generate_server {
|
||||||
|
@ -223,10 +251,10 @@ impl ServiceGenerator for ProtobufServiceGenerator {
|
||||||
let code_str = prettyplease::unparse(&gen_code);
|
let code_str = prettyplease::unparse(&gen_code);
|
||||||
buf.push_str(&code_str);
|
buf.push_str(&code_str);
|
||||||
}
|
}
|
||||||
|
if !self.modules.contains(&service.package) {
|
||||||
|
self.modules.push(service.package.clone());
|
||||||
|
generate_mod_rs(&self.modules, &self.out_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize_package(&mut self, _package: &str, buf: &mut String) {
|
|
||||||
self.finalize(buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize(&mut self, buf: &mut String) {
|
fn finalize(&mut self, buf: &mut String) {
|
||||||
|
@ -258,5 +286,9 @@ impl ServiceGenerator for ProtobufServiceGenerator {
|
||||||
let gen_code: syn::File = syn::parse2(gen_code).expect("invalid tokenstream");
|
let gen_code: syn::File = syn::parse2(gen_code).expect("invalid tokenstream");
|
||||||
let code_str = prettyplease::unparse(&gen_code);
|
let code_str = prettyplease::unparse(&gen_code);
|
||||||
buf.push_str(&code_str);
|
buf.push_str(&code_str);
|
||||||
|
|
||||||
|
self.modules.clear();
|
||||||
|
self.client_reexports.clear();
|
||||||
|
self.server_reexports.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,12 @@ use std::error::Error;
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
use nrpc::ServerService;
|
use nrpc::ServerService;
|
||||||
|
|
||||||
pub mod helloworld {
|
pub mod generated {
|
||||||
include!(concat!(env!("OUT_DIR"), "/helloworld.rs"));
|
include!(concat!(env!("OUT_DIR"), "/mod.rs"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let req = helloworld::HelloRequest {
|
let req = helloworld::HelloRequest {
|
||||||
|
|
Loading…
Reference in a new issue