Skip to content

Commit 073c481

Browse files
committed
Move kind check to from_json_value
1 parent 1ef6561 commit 073c481

10 files changed

+201
-261
lines changed

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

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -178,16 +178,32 @@ impl Struct {
178178

179179
#convert_method
180180

181-
fn from_json_value(value: #serde_json_path::Value) -> ::std::result::Result<Self, #parse_object_error> {
182-
let api_version = value
181+
fn from_json_value(object: #serde_json_path::Value) -> ::std::result::Result<Self, #parse_object_error> {
182+
let object_kind = object
183+
.get("kind")
184+
.ok_or_else(|| #parse_object_error::FieldMissing{ field: "kind".to_string() })?
185+
.as_str()
186+
.ok_or_else(|| #parse_object_error::FieldNotStr{ field: "kind".to_string() })?;
187+
188+
// Note(@sbernauer): One could argue we don't need to check the kind, but this
189+
// is a nice sanity check. If for *some* reason a unexpected kind ends up at a
190+
// conversion, the problem might be very hard to spot without this.
191+
if object_kind != stringify!(#enum_ident) {
192+
return Err(#parse_object_error::UnexpectedObjectKind{
193+
kind: object_kind.to_string(),
194+
supported_kind: stringify!(#enum_ident).to_string(),
195+
});
196+
}
197+
198+
let api_version = object
183199
.get("apiVersion")
184200
.ok_or_else(|| #parse_object_error::FieldMissing{ field: "apiVersion".to_string() })?
185201
.as_str()
186202
.ok_or_else(|| #parse_object_error::FieldNotStr{ field: "apiVersion".to_string() })?;
187203

188204
let object = match api_version {
189205
#(#api_versions => {
190-
let object = #serde_json_path::from_value(value)
206+
let object = #serde_json_path::from_value(object)
191207
.map_err(|source| #parse_object_error::Deserialize { source })?;
192208

193209
Self::#variant_idents(object)
@@ -321,7 +337,6 @@ impl Struct {
321337
let versioned_path = &*kubernetes_arguments.crates.versioned;
322338
let kube_core_path = &*kubernetes_arguments.crates.kube_core;
323339

324-
let parse_object_error = quote! { #versioned_path::ParseObjectError };
325340
let convert_object_error = quote! { #versioned_path::ConvertObjectError };
326341

327342
// Generate conversion paths and the match arms for these paths
@@ -432,27 +447,6 @@ impl Struct {
432447
let mut converted_objects = ::std::vec::Vec::with_capacity(objects.len());
433448

434449
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-
// Note(@sbernauer): One could argue we don't need to check the send kind, but
445-
// IMHO this is a nice sanity check. If for *some* reason a wrong kind ends up
446-
// at a conversion, the problem might be very hard to spot without this.
447-
if object_kind != stringify!(#struct_ident) {
448-
return Err(#convert_object_error::Parse {
449-
source: #parse_object_error::WrongObjectKind{
450-
kind: object_kind.to_string(),
451-
supported_kind: stringify!(#struct_ident).to_string(),
452-
}
453-
})
454-
}
455-
456450
// This clone is required because in the noop case we move the object into
457451
// the converted objects vec.
458452
let current_object = Self::from_json_value(object.clone())

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

Lines changed: 20 additions & 26 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: 20 additions & 26 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@crate_overrides.rs.snap

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

0 commit comments

Comments
 (0)