Skip to content

Commit 0804c68

Browse files
committed
feat(stackable-versioned): Generate primitive Status struct
1 parent 45f1e30 commit 0804c68

File tree

6 files changed

+80
-15
lines changed

6 files changed

+80
-15
lines changed

Cargo.lock

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

crates/stackable-versioned-macros/src/attrs/k8s.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ pub(crate) struct KubernetesSkipArguments {
6161
/// This struct contains crate overrides to be passed to `#[kube]`.
6262
#[derive(Clone, Debug, FromMeta)]
6363
pub(crate) struct KubernetesCrateArguments {
64-
pub(crate) kube_core: Option<Path>,
65-
pub(crate) k8s_openapi: Option<Path>,
66-
pub(crate) schemars: Option<Path>,
67-
pub(crate) serde: Option<Path>,
68-
pub(crate) serde_json: Option<Path>,
64+
pub kube_core: Option<Path>,
65+
pub k8s_openapi: Option<Path>,
66+
pub schemars: Option<Path>,
67+
pub serde: Option<Path>,
68+
pub serde_json: Option<Path>,
69+
pub versioned: Option<Path>,
6970
}

crates/stackable-versioned-macros/src/codegen/container/mod.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ impl Container {
9595
///
9696
/// This function only returns `Some` if it is a struct. Enums cannot be used to define
9797
/// Kubernetes custom resources.
98-
pub(crate) fn generate_kubernetes_item(
98+
pub fn generate_kubernetes_item(
9999
&self,
100100
version: &VersionDefinition,
101101
) -> Option<(IdentString, String, TokenStream)> {
@@ -109,7 +109,7 @@ impl Container {
109109
///
110110
/// This function only returns `Some` if it is a struct. Enums cannot be used to define
111111
/// Kubernetes custom resources.
112-
pub(crate) fn generate_kubernetes_merge_crds(
112+
pub fn generate_kubernetes_merge_crds(
113113
&self,
114114
enum_variant_idents: &[IdentString],
115115
enum_variant_strings: &[String],
@@ -129,7 +129,14 @@ impl Container {
129129
}
130130
}
131131

132-
pub(crate) fn get_original_ident(&self) -> &Ident {
132+
pub fn generate_kubernetes_status_struct(&self, vis: &Visibility) -> Option<TokenStream> {
133+
match self {
134+
Container::Struct(s) => s.generate_kubernetes_status_struct(vis),
135+
Container::Enum(_) => None,
136+
}
137+
}
138+
139+
pub fn get_original_ident(&self) -> &Ident {
133140
match &self {
134141
Container::Struct(s) => s.common.idents.original.as_ident(),
135142
Container::Enum(e) => e.common.idents.original.as_ident(),
@@ -252,6 +259,10 @@ impl StandaloneContainer {
252259
false,
253260
));
254261

262+
if self.versions.len() > 1 {
263+
tokens.extend(self.container.generate_kubernetes_status_struct(vis));
264+
}
265+
255266
tokens
256267
}
257268
}
@@ -344,11 +355,13 @@ pub struct KubernetesCrateOptions {
344355
pub schemars: Override<Path>,
345356
pub serde: Override<Path>,
346357
pub serde_json: Override<Path>,
358+
pub versioned: Override<Path>,
347359
}
348360

349361
impl Default for KubernetesCrateOptions {
350362
fn default() -> Self {
351363
Self {
364+
versioned: Override::Default(parse_quote! { ::stackable_versioned }),
352365
k8s_openapi: Override::Default(parse_quote! { ::k8s_openapi }),
353366
serde_json: Override::Default(parse_quote! { ::serde_json }),
354367
kube_core: Override::Default(parse_quote! { ::kube::core }),
@@ -382,6 +395,10 @@ impl From<KubernetesCrateArguments> for KubernetesCrateOptions {
382395
crate_options.serde = Override::Overridden(serde);
383396
}
384397

398+
if let Some(versioned) = args.versioned {
399+
crate_options.versioned = Override::Overridden(versioned);
400+
}
401+
385402
crate_options
386403
}
387404
}
@@ -396,6 +413,7 @@ impl ToTokens for KubernetesCrateOptions {
396413
kube_core,
397414
schemars,
398415
serde,
416+
..
399417
} = self;
400418

401419
if let Override::Overridden(k8s_openapi) = k8s_openapi {

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

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::ops::Not;
22

33
use darling::{Error, FromAttributes, Result, util::IdentString};
44
use proc_macro2::TokenStream;
5-
use quote::{ToTokens, quote};
5+
use quote::{ToTokens, format_ident, quote};
66
use syn::{Generics, ItemStruct, Path, Visibility, parse_quote};
77

88
use crate::{
@@ -305,10 +305,7 @@ impl Struct {
305305

306306
// Kubernetes-specific token generation
307307
impl Struct {
308-
pub(crate) fn generate_kube_attribute(
309-
&self,
310-
version: &VersionDefinition,
311-
) -> Option<TokenStream> {
308+
pub fn generate_kube_attribute(&self, version: &VersionDefinition) -> Option<TokenStream> {
312309
match &self.common.options.kubernetes_options {
313310
Some(kubernetes_options) => {
314311
// Required arguments
@@ -359,7 +356,7 @@ impl Struct {
359356
}
360357
}
361358

362-
pub(crate) fn generate_kubernetes_item(
359+
pub fn generate_kubernetes_item(
363360
&self,
364361
version: &VersionDefinition,
365362
) -> Option<(IdentString, String, TokenStream)> {
@@ -384,7 +381,7 @@ impl Struct {
384381
}
385382
}
386383

387-
pub(crate) fn generate_kubernetes_merge_crds(
384+
pub fn generate_kubernetes_merge_crds(
388385
&self,
389386
enum_variant_idents: &[IdentString],
390387
enum_variant_strings: &[String],
@@ -434,4 +431,41 @@ impl Struct {
434431
_ => None,
435432
}
436433
}
434+
435+
pub fn generate_kubernetes_status_struct(&self, vis: &Visibility) -> Option<TokenStream> {
436+
match &self.common.options.kubernetes_options {
437+
Some(kubernetes_options) => {
438+
let status_ident = format_ident!(
439+
"{struct_ident}Status",
440+
struct_ident = self.common.idents.kubernetes.as_ident()
441+
);
442+
443+
let versioned_crate = &*kubernetes_options.crates.versioned;
444+
let schemars_crate = &*kubernetes_options.crates.schemars;
445+
let serde_crate = &*kubernetes_options.crates.serde;
446+
447+
// FIXME (@Techassi): This needs to be set in the #[kube] attribute
448+
match &kubernetes_options.status {
449+
Some(status) => Some(quote! {
450+
#[derive(Clone, Debug, #serde_crate::Deserialize, #serde_crate::Serialize, #schemars_crate::JsonSchema)]
451+
#[serde(rename_all = "camelCase")]
452+
#vis struct #status_ident {
453+
pub crd_changes: #versioned_crate::CrdChanges,
454+
455+
#[serde(flatten)]
456+
pub status: #status,
457+
}
458+
}),
459+
None => Some(quote! {
460+
#[derive(Clone, Debug, #serde_crate::Deserialize, #serde_crate::Serialize, #schemars_crate::JsonSchema)]
461+
#[serde(rename_all = "camelCase")]
462+
#vis struct #status_ident {
463+
pub crd_changes: #versioned_crate::CrdChanges,
464+
}
465+
}),
466+
}
467+
}
468+
None => None,
469+
}
470+
}
437471
}

crates/stackable-versioned/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ all-features = true
1414
full = ["k8s"]
1515
k8s = [
1616
"stackable-versioned-macros/k8s", # Forward the k8s feature to the underlying macro crate
17+
"dep:schemars",
18+
"dep:serde",
1719
]
1820

1921
[dependencies]
2022
stackable-versioned-macros = { path = "../stackable-versioned-macros" }
23+
schemars = { workspace = true, optional = true }
24+
serde = { workspace = true, optional = true }

crates/stackable-versioned/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ pub trait AsVersionStr {
2424
Self::VERSION
2525
}
2626
}
27+
28+
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
29+
pub struct CrdChanges {
30+
pub downgrades: Vec<String>,
31+
pub upgrades: Vec<String>,
32+
}

0 commit comments

Comments
 (0)