Skip to content

Commit db2f65c

Browse files
committed
Check Kind of send object
1 parent ca11c44 commit db2f65c

10 files changed

+481
-106
lines changed

crates/stackable-versioned-macros/src/codegen/container/struct/k8s.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ impl Struct {
181181
fn from_json_value(value: #serde_json_path::Value) -> ::std::result::Result<Self, #parse_object_error> {
182182
let api_version = value
183183
.get("apiVersion")
184-
.ok_or_else(|| #parse_object_error::FieldNotPresent)?
184+
.ok_or_else(|| #parse_object_error::FieldMissing{ field: "apiVersion".to_string() })?
185185
.as_str()
186-
.ok_or_else(|| #parse_object_error::FieldNotStr)?;
186+
.ok_or_else(|| #parse_object_error::FieldNotStr{ field: "apiVersion".to_string() })?;
187187

188188
let object = match api_version {
189189
#(#api_versions => {
@@ -321,6 +321,7 @@ impl Struct {
321321
let versioned_path = &*kubernetes_arguments.crates.versioned;
322322
let kube_core_path = &*kubernetes_arguments.crates.kube_core;
323323

324+
let parse_object_error = quote! { #versioned_path::ParseObjectError };
324325
let convert_object_error = quote! { #versioned_path::ConvertObjectError };
325326

326327
// Generate conversion paths and the match arms for these paths
@@ -431,6 +432,24 @@ impl Struct {
431432
let mut converted_objects = ::std::vec::Vec::with_capacity(objects.len());
432433

433434
for object in objects {
435+
let object_kind = object
436+
.get("kind")
437+
.ok_or_else(|| #convert_object_error::Parse {
438+
source: #parse_object_error::FieldMissing{ field: "kind".to_string() }
439+
})?
440+
.as_str()
441+
.ok_or_else(|| #convert_object_error::Parse {
442+
source: #parse_object_error::FieldNotStr{ field: "kind".to_string() }
443+
})?;
444+
if object_kind != stringify!(#struct_ident) {
445+
return Err(#convert_object_error::Parse {
446+
source: #parse_object_error::WrongObjectKind{
447+
kind: object_kind.to_string(),
448+
supported_kind: stringify!(#struct_ident).to_string(),
449+
}
450+
})
451+
}
452+
434453
// This clone is required because in the noop case we move the object into
435454
// the converted objects vec.
436455
let current_object = Self::from_json_value(object.clone())

crates/stackable-versioned-macros/tests/snapshots/[email protected]

Lines changed: 49 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/stackable-versioned-macros/tests/snapshots/stackable_versioned_macros__snapshot_tests__k8s@conversion_tracking.rs.snap

Lines changed: 49 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)