Add higher-level code gen traits

This commit is contained in:
NGnius (Graham) 2023-04-16 14:41:04 -04:00
parent 4677c02eab
commit eddfa40933
4 changed files with 52 additions and 2 deletions

2
Cargo.lock generated
View file

@ -290,7 +290,7 @@ dependencies = [
[[package]]
name = "nrpc-build"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"nrpc",
"prettyplease 0.2.4",

View file

@ -1,6 +1,6 @@
[package]
name = "nrpc-build"
version = "0.3.0"
version = "0.4.0"
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/NGnius/nRPC"

View file

@ -1,7 +1,9 @@
mod builder;
mod preprocessor;
mod service_gen;
mod token_gen_traits;
pub use builder::{compile, compile_servers, compile_clients, Transpiler};
pub use preprocessor::Preprocessor;
pub(crate) use service_gen::ProtobufServiceGenerator;
pub use token_gen_traits::{IServiceGenerator, IPreprocessor, AbstractImpl};

View file

@ -0,0 +1,48 @@
use prost_build::Service;
use prost_types::FileDescriptorSet;
use proc_macro2::TokenStream;
/// Higher-level abstraction of prost_build::ServiceGenerator
pub trait IServiceGenerator {
fn generate(&mut self, service: Service) -> TokenStream;
}
/// Higher-level abstraction of crate::Preprocessor
pub trait IPreprocessor {
fn process(&mut self, fds: &mut FileDescriptorSet) -> TokenStream;
}
/// Low-level interop for high-level traits IServiceGenerator and IPreprocessor
pub struct AbstractImpl<X>(X);
impl<X> AbstractImpl<X> {
pub fn inner(self) -> X {
self.0
}
pub fn outer(value: X) -> Self {
Self(value)
}
}
impl<X> std::convert::From<X> for AbstractImpl<X> {
fn from(value: X) -> Self {
Self(value)
}
}
impl<X: IServiceGenerator> prost_build::ServiceGenerator for AbstractImpl<X> {
fn generate(&mut self, service: Service, buf: &mut String) {
let gen_code: syn::File = syn::parse2(self.0.generate(service)).expect("invalid tokenstream");
let code_str = prettyplease::unparse(&gen_code);
buf.push_str(&code_str);
}
}
impl<X: IPreprocessor> super::Preprocessor for AbstractImpl<X> {
fn process(&mut self, fds: &mut FileDescriptorSet, buf: &mut String) {
let gen_code: syn::File = syn::parse2(self.0.process(fds)).expect("invalid tokenstream");
let code_str = prettyplease::unparse(&gen_code);
buf.push_str(&code_str);
}
}