|
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