From 80289eb2bdf7bcced73c8e280bd4a56b598eb4c8 Mon Sep 17 00:00:00 2001 From: clux Date: Sun, 22 Aug 2021 17:46:50 +0100 Subject: [PATCH] attempts to make servicegenerator work Signed-off-by: clux --- README.md | 6 ++---- build.rs | 24 ++++++++++++------------ justfile | 7 +++++++ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 6ddb80a..af704d8 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,9 @@ Results of this step is committed already. But to run, invoke `just swagger`. ## Building -With all dependent `swagger` and `protos` files built, run: +To build the [out](./out) directory from [build.rs](./build.rs) using swagger and protobuf results run `just build`. -```bash -cargo build -``` +Results of this step is committed already. ### Hack diff --git a/build.rs b/build.rs index 1350d7a..e9ef03c 100644 --- a/build.rs +++ b/build.rs @@ -4,8 +4,8 @@ use std::rc::Rc; #[derive(Default)] struct GeneratorState { service_names: Vec, - package_names: Vec, finalized: usize, + generated: usize } struct KubeGenerator { @@ -20,22 +20,21 @@ impl KubeGenerator { } impl prost_build::ServiceGenerator for KubeGenerator { - fn generate(&mut self, service: prost_build::Service, _buf: &mut String) { + fn generate(&mut self, service: prost_build::Service, buf: &mut String) { let mut state = self.state.borrow_mut(); state.service_names.push(service.name); + state.generated += 1; + // TODO: THIS doesn't work? never called by prost_build, bug? + let generics = format!("// TODO: generate\n"); + buf.push_str(&generics); } - fn finalize(&mut self, _buf: &mut String) { + fn finalize(&mut self, buf: &mut String) { let mut state = self.state.borrow_mut(); state.finalized += 1; - } - - fn finalize_package(&mut self, package: &str, buf: &mut String) { - let mut state = self.state.borrow_mut(); - state.package_names.push(package.to_string()); - // TODO: generate generics for pkg here using self.data - let pkg_generics = format!("// blahtest"); - buf.push_str(&pkg_generics); + // NB: THIS works, but we need a name here before it's useful + //let generics = format!("// TODO: finalize\n"); + //buf.push_str(&generics); } } @@ -47,12 +46,13 @@ fn main() -> std::io::Result<()> { let state = Rc::new(RefCell::new(GeneratorState::default())); prost_build::Config::new() .service_generator(Box::new(KubeGenerator::new(Rc::clone(&state)))) + .out_dir("./out") .compile_protos(protos.as_slice(), &["protos/"])?; // sanity let state = state.borrow(); - //assert_eq!(state.service_names.len(), protos.len()); zero atm.. assert_eq!(state.finalized, protos.len()); + assert_eq!(state.generated, protos.len()); // TODO: why does generate not trigger // Generate code in `src/` by reading files in `OUT_DIR`? // Need to create `mod.rs` file for each level based on the filename, and write generated code in correct file. diff --git a/justfile b/justfile index 31d5bba..2dd5bba 100644 --- a/justfile +++ b/justfile @@ -60,3 +60,10 @@ swagger-transform: # Download and generate all swagger dependent files swagger: swagger-dl swagger-patch swagger-transform + +# Generate the library code from completed swagger and protos +build: + #!/usr/bin/env bash + set -exuo pipefail + rm -rf out/ && mkdir out + cargo build