|
1 |
| -use std::cell::RefCell; |
2 |
| -use std::rc::Rc; |
3 |
| - |
4 |
| -#[derive(Default)] |
5 |
| -struct GeneratorState { |
6 |
| - service_names: Vec<String>, |
7 |
| - finalized: usize, |
8 |
| - generated: usize |
9 |
| -} |
10 |
| - |
11 |
| -struct KubeGenerator { |
12 |
| - data: String, |
13 |
| - state: Rc<RefCell<GeneratorState>>, |
14 |
| -} |
15 |
| -impl KubeGenerator { |
16 |
| - fn new(state: Rc<RefCell<GeneratorState>>) -> Self { |
17 |
| - let data = std::fs::read_to_string("./openapi/api-resources.json").unwrap(); |
18 |
| - Self { data, state } |
19 |
| - } |
20 |
| -} |
21 |
| - |
22 |
| -impl prost_build::ServiceGenerator for KubeGenerator { |
23 |
| - fn generate(&mut self, service: prost_build::Service, buf: &mut String) { |
24 |
| - let mut state = self.state.borrow_mut(); |
25 |
| - state.service_names.push(service.name); |
26 |
| - state.generated += 1; |
27 |
| - // TODO: THIS doesn't work? never called by prost_build, bug? |
28 |
| - let generics = format!("// TODO: generate\n"); |
29 |
| - buf.push_str(&generics); |
30 |
| - } |
31 |
| - |
32 |
| - fn finalize(&mut self, buf: &mut String) { |
33 |
| - let mut state = self.state.borrow_mut(); |
34 |
| - state.finalized += 1; |
35 |
| - // NB: THIS works, but we need a name here before it's useful |
36 |
| - //let generics = format!("// TODO: finalize\n"); |
37 |
| - //buf.push_str(&generics); |
38 |
| - } |
39 |
| -} |
| 1 | +use prost_types::{FileDescriptorProto, FileDescriptorSet}; |
| 2 | +use prost::Message; |
40 | 3 |
|
41 | 4 | fn main() -> std::io::Result<()> {
|
42 |
| - let protos: Vec<&str> = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/protos.list")) |
| 5 | + let protos = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/protos.list")) |
43 | 6 | .lines()
|
44 |
| - .collect(); |
| 7 | + .collect::<Vec<&str>>(); |
45 | 8 |
|
46 |
| - let state = Rc::new(RefCell::new(GeneratorState::default())); |
47 | 9 | prost_build::Config::new()
|
48 |
| - .service_generator(Box::new(KubeGenerator::new(Rc::clone(&state)))) |
| 10 | + // should probably switch to this |
| 11 | + //.btree_map(&["."]) |
49 | 12 | .out_dir("./out")
|
50 | 13 | .compile_protos(protos.as_slice(), &["protos/"])?;
|
51 | 14 |
|
52 |
| - // sanity |
53 |
| - let state = state.borrow(); |
54 |
| - assert_eq!(state.finalized, protos.len()); |
55 |
| - assert_eq!(state.generated, protos.len()); // TODO: why does generate not trigger |
| 15 | + let apis = std::fs::read_to_string("./openapi/api-resources.json")?; |
| 16 | + |
| 17 | + let buf = std::fs::read("./protos.fds").unwrap(); |
| 18 | + let fds = FileDescriptorSet::decode(&*buf).unwrap(); // pulls in proto::Message |
| 19 | + |
| 20 | + // NB: FDS fields: https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-types/src/protobuf.rs#L1-L7 |
| 21 | + // FDS usage: https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-build/src/lib.rs#L765-L825 |
| 22 | + for f in fds.file { |
| 23 | + use std::io::Write; |
| 24 | + if let Some(pkg) = f.package { |
| 25 | + let pkgpath = std::path::Path::new("./out").join(format!("{}.rs", pkg)); |
| 26 | + let generics = format!("// TODO genericsfor {}\n", pkg); |
| 27 | + let mut file = std::fs::OpenOptions::new().write(true).append(true).open(&pkgpath)?; |
| 28 | + file.write(generics.as_bytes())?; |
| 29 | + } |
| 30 | + } |
56 | 31 |
|
57 | 32 | // Generate code in `src/` by reading files in `OUT_DIR`?
|
58 | 33 | // Need to create `mod.rs` file for each level based on the filename, and write generated code in correct file.
|
|
0 commit comments