Skip to content

Commit f0c1781

Browse files
committed
feat(versioned): Add KubernetesConvertable trait
1 parent 7b39422 commit f0c1781

12 files changed

+563
-514
lines changed

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ impl Struct {
156156
let status_struct = self.generate_kubernetes_status_struct(kubernetes_arguments, is_nested);
157157
let version_enum =
158158
self.generate_kubernetes_version_enum(kubernetes_arguments, tokens, vis, is_nested);
159-
let convert_method = self.generate_kubernetes_conversion(versions);
159+
let (try_convert_fn, convert_objects_fn) =
160+
self.generate_kubernetes_conversion_functions(versions);
160161

161162
let parse_object_error = quote! { #versioned_path::ParseObjectError };
162163

@@ -178,7 +179,7 @@ impl Struct {
178179
#kube_core_path::crd::merge_crds(vec![#(#crd_fns),*], stored_apiversion.as_version_str())
179180
}
180181

181-
#convert_method
182+
#convert_objects_fn
182183

183184
fn from_json_object(object_value: #serde_json_path::Value) -> ::std::result::Result<Self, #parse_object_error> {
184185
let object_kind = object_value
@@ -227,6 +228,10 @@ impl Struct {
227228
}
228229
}
229230

231+
impl #versioned_path::KubernetesConvertable for #enum_ident {
232+
#try_convert_fn
233+
}
234+
230235
#version_enum
231236
#status_struct
232237
})
@@ -354,11 +359,23 @@ impl Struct {
354359
})
355360
}
356361

357-
fn generate_kubernetes_conversion(
362+
/// Generates functions that are related to Kubernetes conversion.
363+
///
364+
/// It will return two functions:
365+
///
366+
/// 1. `try_convert`: This function should be used to implement the
367+
/// `stackable_versioned::KubernetesConvertable` trait.
368+
/// 2. `convert_objects`: This is an internal helper for `try_convert`
369+
fn generate_kubernetes_conversion_functions(
358370
&self,
359371
versions: &[VersionDefinition],
360-
) -> Option<TokenStream> {
361-
let kubernetes_arguments = self.common.options.kubernetes_arguments.as_ref()?;
372+
) -> (TokenStream, TokenStream) {
373+
let kubernetes_arguments = self
374+
.common
375+
.options
376+
.kubernetes_arguments
377+
.as_ref()
378+
.expect("The kubernetes arguments must be present when generating Kubernetes conversion functions");
362379

363380
let struct_ident = &self.common.idents.kubernetes;
364381
let version_enum_ident = &self.common.idents.kubernetes_version;
@@ -398,10 +415,10 @@ impl Struct {
398415
}
399416
.into_doc_comments();
400417

401-
Some(quote! {
418+
let try_convert_fn = quote! {
402419
#(#[doc = #docs])*
403420
#try_convert_instrumentation
404-
pub fn try_convert(review: #kube_core_path::conversion::ConversionReview)
421+
fn try_convert(review: #kube_core_path::conversion::ConversionReview)
405422
-> #kube_core_path::conversion::ConversionReview
406423
{
407424
// First, turn the review into a conversion request
@@ -462,7 +479,8 @@ impl Struct {
462479

463480
response.into_review()
464481
}
465-
482+
};
483+
let convert_objects_fn = quote! {
466484
#convert_objects_instrumentation
467485
fn convert_objects(
468486
objects: ::std::vec::Vec<#serde_json_path::Value>,
@@ -501,7 +519,9 @@ impl Struct {
501519

502520
::std::result::Result::Ok(converted_objects)
503521
}
504-
})
522+
};
523+
524+
(try_convert_fn, convert_objects_fn)
505525
}
506526

507527
fn generate_kubernetes_conversion_match_arms(

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

Lines changed: 58 additions & 56 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: 58 additions & 56 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)