Skip to content

Commit

Permalink
drop servicegenerater and use fds to inject into files
Browse files Browse the repository at this point in the history
Signed-off-by: clux <sszynrae@gmail.com>
  • Loading branch information
clux committed Aug 22, 2021
1 parent 80289eb commit 1350ff7
Show file tree
Hide file tree
Showing 67 changed files with 103 additions and 73 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/target
Cargo.lock
protos.fds
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ edition = "2018"
[dependencies]
bytes = "1.0.1"
prost = "0.8.0"
prost-types = "0.8"

[build-dependencies]
prost-build = "0.8.0"
prost-types = "0.8.0"
prost = "0.8.0"
27 changes: 3 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,34 +26,13 @@ Results of this step is committed already. But to run, invoke `just swagger`.


## Building
To build the [out](./out) directory from [build.rs](./build.rs) using swagger and protobuf results run `just build`.
To build the [out](./out) directory from [build.rs](./build.rs) we will use the outputs from the `swagger`, `protobuf`, and `protobuf-fds` targets.

Results of this step is committed already.
Results of this step is committed already. But to run, invoke `just build`

### Hack

Generate a [`FileDescriptorSet`] containing all of the input files:

```bash
protoc \
--include_imports \
--include_source_info \
--descriptor_set_out=k8s.pb \
--proto_path=./protos \
./protos/**/*.proto
```

Working with `FileDescriptorSet`:
```rust
use prost_types::{FileDescriptorProto, FileDescriptorSet};
let buf = fs::read(fds_path).unwrap();
let fds = FileDescriptorSet::decode(&*buf).unwrap();
let files = fds.files;
```

See [`prost_build`](https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-build/src/lib.rs#L765-L825).

[`FileDescriptorSet`]: https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-types/src/protobuf.rs#L1-L7
Generate a [`FileDescriptorSet`] containing all of the input files wih `just build-fds`


## OpenAPI Strategy
Expand Down
69 changes: 22 additions & 47 deletions build.rs
Original file line number Diff line number Diff line change
@@ -1,58 +1,33 @@
use std::cell::RefCell;
use std::rc::Rc;

#[derive(Default)]
struct GeneratorState {
service_names: Vec<String>,
finalized: usize,
generated: usize
}

struct KubeGenerator {
data: String,
state: Rc<RefCell<GeneratorState>>,
}
impl KubeGenerator {
fn new(state: Rc<RefCell<GeneratorState>>) -> Self {
let data = std::fs::read_to_string("./openapi/api-resources.json").unwrap();
Self { data, state }
}
}

impl prost_build::ServiceGenerator for KubeGenerator {
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) {
let mut state = self.state.borrow_mut();
state.finalized += 1;
// NB: THIS works, but we need a name here before it's useful
//let generics = format!("// TODO: finalize\n");
//buf.push_str(&generics);
}
}
use prost_types::{FileDescriptorProto, FileDescriptorSet};
use prost::Message;

fn main() -> std::io::Result<()> {
let protos: Vec<&str> = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/protos.list"))
let protos = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/protos.list"))
.lines()
.collect();
.collect::<Vec<&str>>();

let state = Rc::new(RefCell::new(GeneratorState::default()));
prost_build::Config::new()
.service_generator(Box::new(KubeGenerator::new(Rc::clone(&state))))
// should probably switch to this
//.btree_map(&["."])
.out_dir("./out")
.compile_protos(protos.as_slice(), &["protos/"])?;

// sanity
let state = state.borrow();
assert_eq!(state.finalized, protos.len());
assert_eq!(state.generated, protos.len()); // TODO: why does generate not trigger
let apis = std::fs::read_to_string("./openapi/api-resources.json")?;

let buf = std::fs::read("./protos.fds").unwrap();
let fds = FileDescriptorSet::decode(&*buf).unwrap(); // pulls in proto::Message

// NB: FDS fields: https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-types/src/protobuf.rs#L1-L7
// FDS usage: https://github.com/tokio-rs/prost/blob/32bc87cd0b7301f6af1a338e9afd7717d0f42ca9/prost-build/src/lib.rs#L765-L825
for f in fds.file {
use std::io::Write;
if let Some(pkg) = f.package {
let pkgpath = std::path::Path::new("./out").join(format!("{}.rs", pkg));
let generics = format!("// TODO genericsfor {}\n", pkg);
let mut file = std::fs::OpenOptions::new().write(true).append(true).open(&pkgpath)?;
file.write(generics.as_bytes())?;
}
}

// 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.
Expand Down
14 changes: 13 additions & 1 deletion justfile
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,20 @@ swagger-transform:
# Download and generate all swagger dependent files
swagger: swagger-dl swagger-patch swagger-transform

# Build a FileDescriptorSet for custom code generation
build-fds:
#!/usr/bin/env bash
set -exuo pipefail
shopt -s globstar
protoc \
--include_imports \
--include_source_info \
--descriptor_set_out=protos.fds \
--proto_path=./protos \
./protos/**/*.proto
# Generate the library code from completed swagger and protos
build:
build: build-fds
#!/usr/bin/env bash
set -exuo pipefail
rm -rf out/ && mkdir out
Expand Down
1 change: 1 addition & 0 deletions out/api.admission.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,4 @@ pub struct AdmissionReview {
#[prost(message, optional, tag="2")]
pub response: ::core::option::Option<AdmissionResponse>,
}
// TODO genericsfor api.admission.v1
1 change: 1 addition & 0 deletions out/api.admission.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,4 @@ pub struct AdmissionReview {
#[prost(message, optional, tag="2")]
pub response: ::core::option::Option<AdmissionResponse>,
}
// TODO genericsfor api.admission.v1beta1
1 change: 1 addition & 0 deletions out/api.admissionregistration.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -457,3 +457,4 @@ pub struct WebhookClientConfig {
#[prost(bytes="vec", optional, tag="2")]
pub ca_bundle: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
}
// TODO genericsfor api.admissionregistration.v1
1 change: 1 addition & 0 deletions out/api.admissionregistration.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -465,3 +465,4 @@ pub struct WebhookClientConfig {
#[prost(bytes="vec", optional, tag="2")]
pub ca_bundle: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
}
// TODO genericsfor api.admissionregistration.v1beta1
1 change: 1 addition & 0 deletions out/api.apiserverinternal.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,4 @@ pub struct StorageVersionStatus {
#[prost(message, repeated, tag="3")]
pub conditions: ::prost::alloc::vec::Vec<StorageVersionCondition>,
}
// TODO genericsfor api.apiserverinternal.v1alpha1
1 change: 1 addition & 0 deletions out/api.apps.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -737,3 +737,4 @@ pub struct StatefulSetUpdateStrategy {
#[prost(message, optional, tag="2")]
pub rolling_update: ::core::option::Option<RollingUpdateStatefulSetStrategy>,
}
// TODO genericsfor api.apps.v1
1 change: 1 addition & 0 deletions out/api.apps.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -484,3 +484,4 @@ pub struct StatefulSetUpdateStrategy {
#[prost(message, optional, tag="2")]
pub rolling_update: ::core::option::Option<RollingUpdateStatefulSetStrategy>,
}
// TODO genericsfor api.apps.v1beta1
1 change: 1 addition & 0 deletions out/api.apps.v1beta2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -785,3 +785,4 @@ pub struct StatefulSetUpdateStrategy {
#[prost(message, optional, tag="2")]
pub rolling_update: ::core::option::Option<RollingUpdateStatefulSetStrategy>,
}
// TODO genericsfor api.apps.v1beta2
1 change: 1 addition & 0 deletions out/api.authentication.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,4 @@ pub struct UserInfo {
#[prost(map="string, message", tag="4")]
pub extra: ::std::collections::HashMap<::prost::alloc::string::String, ExtraValue>,
}
// TODO genericsfor api.authentication.v1
1 change: 1 addition & 0 deletions out/api.authentication.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,4 @@ pub struct UserInfo {
#[prost(map="string, message", tag="4")]
pub extra: ::std::collections::HashMap<::prost::alloc::string::String, ExtraValue>,
}
// TODO genericsfor api.authentication.v1beta1
1 change: 1 addition & 0 deletions out/api.authorization.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,3 +263,4 @@ pub struct SubjectRulesReviewStatus {
#[prost(string, optional, tag="4")]
pub evaluation_error: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.authorization.v1
1 change: 1 addition & 0 deletions out/api.authorization.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,3 +263,4 @@ pub struct SubjectRulesReviewStatus {
#[prost(string, optional, tag="4")]
pub evaluation_error: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.authorization.v1beta1
1 change: 1 addition & 0 deletions out/api.autoscaling.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -482,3 +482,4 @@ pub struct ScaleStatus {
#[prost(string, optional, tag="2")]
pub selector: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.autoscaling.v1
1 change: 1 addition & 0 deletions out/api.autoscaling.v2beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -459,3 +459,4 @@ pub struct ResourceMetricStatus {
#[prost(message, optional, tag="3")]
pub current_average_value: ::core::option::Option<super::super::super::apimachinery::pkg::api::resource::Quantity>,
}
// TODO genericsfor api.autoscaling.v2beta1
1 change: 1 addition & 0 deletions out/api.autoscaling.v2beta2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -483,3 +483,4 @@ pub struct ResourceMetricStatus {
#[prost(message, optional, tag="2")]
pub current: ::core::option::Option<MetricValueStatus>,
}
// TODO genericsfor api.autoscaling.v2beta2
1 change: 1 addition & 0 deletions out/api.batch.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -348,3 +348,4 @@ pub struct UncountedTerminatedPods {
#[prost(string, repeated, tag="2")]
pub failed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
// TODO genericsfor api.batch.v1
1 change: 1 addition & 0 deletions out/api.batch.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,4 @@ pub struct JobTemplateSpec {
#[prost(message, optional, tag="2")]
pub spec: ::core::option::Option<super::v1::JobSpec>,
}
// TODO genericsfor api.batch.v1beta1
1 change: 1 addition & 0 deletions out/api.certificates.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,3 +223,4 @@ pub struct ExtraValue {
#[prost(string, repeated, tag="1")]
pub items: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
// TODO genericsfor api.certificates.v1
1 change: 1 addition & 0 deletions out/api.certificates.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,4 @@ pub struct ExtraValue {
#[prost(string, repeated, tag="1")]
pub items: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
// TODO genericsfor api.certificates.v1beta1
1 change: 1 addition & 0 deletions out/api.coordination.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,4 @@ pub struct LeaseSpec {
#[prost(int32, optional, tag="5")]
pub lease_transitions: ::core::option::Option<i32>,
}
// TODO genericsfor api.coordination.v1
1 change: 1 addition & 0 deletions out/api.coordination.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,4 @@ pub struct LeaseSpec {
#[prost(int32, optional, tag="5")]
pub lease_transitions: ::core::option::Option<i32>,
}
// TODO genericsfor api.coordination.v1beta1
1 change: 1 addition & 0 deletions out/api.core.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5824,3 +5824,4 @@ pub struct WindowsSecurityContextOptions {
#[prost(bool, optional, tag="4")]
pub host_process: ::core::option::Option<bool>,
}
// TODO genericsfor api.core.v1
1 change: 1 addition & 0 deletions out/api.discovery.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,4 @@ pub struct ForZone {
#[prost(string, optional, tag="1")]
pub name: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.discovery.v1
1 change: 1 addition & 0 deletions out/api.discovery.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,4 @@ pub struct ForZone {
#[prost(string, optional, tag="1")]
pub name: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.discovery.v1beta1
1 change: 1 addition & 0 deletions out/api.events.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,4 @@ pub struct EventSeries {
#[prost(message, optional, tag="2")]
pub last_observed_time: ::core::option::Option<super::super::super::apimachinery::pkg::apis::meta::v1::MicroTime>,
}
// TODO genericsfor api.events.v1
1 change: 1 addition & 0 deletions out/api.events.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,4 @@ pub struct EventSeries {
#[prost(message, optional, tag="2")]
pub last_observed_time: ::core::option::Option<super::super::super::apimachinery::pkg::apis::meta::v1::MicroTime>,
}
// TODO genericsfor api.events.v1beta1
1 change: 1 addition & 0 deletions out/api.extensions.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1295,3 +1295,4 @@ pub struct SupplementalGroupsStrategyOptions {
#[prost(message, repeated, tag="2")]
pub ranges: ::prost::alloc::vec::Vec<IdRange>,
}
// TODO genericsfor api.extensions.v1beta1
1 change: 1 addition & 0 deletions out/api.flowcontrol.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,3 +428,4 @@ pub struct UserSubject {
#[prost(string, optional, tag="1")]
pub name: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.flowcontrol.v1alpha1
1 change: 1 addition & 0 deletions out/api.flowcontrol.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,3 +428,4 @@ pub struct UserSubject {
#[prost(string, optional, tag="1")]
pub name: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.flowcontrol.v1beta1
1 change: 1 addition & 0 deletions out/api.imagepolicy.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,4 @@ pub struct ImageReviewStatus {
#[prost(map="string, string", tag="3")]
pub audit_annotations: ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>,
}
// TODO genericsfor api.imagepolicy.v1alpha1
1 change: 1 addition & 0 deletions out/api.networking.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -494,3 +494,4 @@ pub struct ServiceBackendPort {
#[prost(int32, optional, tag="2")]
pub number: ::core::option::Option<i32>,
}
// TODO genericsfor api.networking.v1
1 change: 1 addition & 0 deletions out/api.networking.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,3 +285,4 @@ pub struct IngressTls {
#[prost(string, optional, tag="2")]
pub secret_name: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.networking.v1beta1
1 change: 1 addition & 0 deletions out/api.node.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,4 @@ pub struct Scheduling {
#[prost(message, repeated, tag="2")]
pub tolerations: ::prost::alloc::vec::Vec<super::super::core::v1::Toleration>,
}
// TODO genericsfor api.node.v1
1 change: 1 addition & 0 deletions out/api.node.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,4 @@ pub struct Scheduling {
#[prost(message, repeated, tag="2")]
pub tolerations: ::prost::alloc::vec::Vec<super::super::core::v1::Toleration>,
}
// TODO genericsfor api.node.v1alpha1
1 change: 1 addition & 0 deletions out/api.node.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,4 @@ pub struct Scheduling {
#[prost(message, repeated, tag="2")]
pub tolerations: ::prost::alloc::vec::Vec<super::super::core::v1::Toleration>,
}
// TODO genericsfor api.node.v1beta1
1 change: 1 addition & 0 deletions out/api.policy.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,4 @@ pub struct PodDisruptionBudgetStatus {
#[prost(message, repeated, tag="7")]
pub conditions: ::prost::alloc::vec::Vec<super::super::super::apimachinery::pkg::apis::meta::v1::Condition>,
}
// TODO genericsfor api.policy.v1
1 change: 1 addition & 0 deletions out/api.policy.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -415,3 +415,4 @@ pub struct SupplementalGroupsStrategyOptions {
#[prost(message, repeated, tag="2")]
pub ranges: ::prost::alloc::vec::Vec<IdRange>,
}
// TODO genericsfor api.policy.v1beta1
1 change: 1 addition & 0 deletions out/api.rbac.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,4 @@ pub struct Subject {
#[prost(string, optional, tag="4")]
pub namespace: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.rbac.v1
1 change: 1 addition & 0 deletions out/api.rbac.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,4 @@ pub struct Subject {
#[prost(string, optional, tag="4")]
pub namespace: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.rbac.v1alpha1
1 change: 1 addition & 0 deletions out/api.rbac.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,4 @@ pub struct Subject {
#[prost(string, optional, tag="4")]
pub namespace: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.rbac.v1beta1
1 change: 1 addition & 0 deletions out/api.scheduling.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,4 @@ pub struct PriorityClassList {
#[prost(message, repeated, tag="2")]
pub items: ::prost::alloc::vec::Vec<PriorityClass>,
}
// TODO genericsfor api.scheduling.v1
1 change: 1 addition & 0 deletions out/api.scheduling.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ pub struct PriorityClassList {
#[prost(message, repeated, tag="2")]
pub items: ::prost::alloc::vec::Vec<PriorityClass>,
}
// TODO genericsfor api.scheduling.v1alpha1
1 change: 1 addition & 0 deletions out/api.scheduling.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ pub struct PriorityClassList {
#[prost(message, repeated, tag="2")]
pub items: ::prost::alloc::vec::Vec<PriorityClass>,
}
// TODO genericsfor api.scheduling.v1beta1
1 change: 1 addition & 0 deletions out/api.storage.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -446,3 +446,4 @@ pub struct VolumeNodeResources {
#[prost(int32, optional, tag="1")]
pub count: ::core::option::Option<i32>,
}
// TODO genericsfor api.storage.v1
1 change: 1 addition & 0 deletions out/api.storage.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,3 +201,4 @@ pub struct VolumeError {
#[prost(string, optional, tag="2")]
pub message: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor api.storage.v1alpha1
1 change: 1 addition & 0 deletions out/api.storage.v1beta1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,3 +540,4 @@ pub struct VolumeNodeResources {
#[prost(int32, optional, tag="1")]
pub count: ::core::option::Option<i32>,
}
// TODO genericsfor api.storage.v1beta1
1 change: 1 addition & 0 deletions out/apiextensions_apiserver.pkg.apis.apiextensions.v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -649,3 +649,4 @@ pub struct WebhookConversion {
#[prost(string, repeated, tag="3")]
pub conversion_review_versions: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
// TODO genericsfor apiextensions_apiserver.pkg.apis.apiextensions.v1
Original file line number Diff line number Diff line change
Expand Up @@ -685,3 +685,4 @@ pub struct WebhookClientConfig {
#[prost(bytes="vec", optional, tag="2")]
pub ca_bundle: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
}
// TODO genericsfor apiextensions_apiserver.pkg.apis.apiextensions.v1beta1
1 change: 1 addition & 0 deletions out/apimachinery.pkg.api.resource.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ pub struct Quantity {
#[prost(string, optional, tag="1")]
pub string: ::core::option::Option<::prost::alloc::string::String>,
}
// TODO genericsfor apimachinery.pkg.api.resource
Loading

0 comments on commit 1350ff7

Please sign in to comment.