Skip to content

Commit 710d69b

Browse files
committed
chore(stackable-versioned): Error if nested is used without experimental flag
1 parent 65a768c commit 710d69b

File tree

5 files changed

+42
-31
lines changed

5 files changed

+42
-31
lines changed

crates/stackable-versioned-macros/src/attrs/item/field.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use darling::{FromField, Result, util::Flag};
1+
use darling::{Error, FromField, Result, util::Flag};
22
use syn::{Attribute, Ident};
33

44
use crate::{attrs::item::CommonItemAttributes, codegen::VersionDefinition, utils::FieldIdent};
@@ -64,4 +64,15 @@ impl FieldAttributes {
6464
pub fn validate_versions(&self, versions: &[VersionDefinition]) -> Result<()> {
6565
self.common.validate_versions(versions)
6666
}
67+
68+
pub fn validate_nested_flag(&self, experimental_conversion_tracking: bool) -> Result<()> {
69+
if self.nested.is_present() && !experimental_conversion_tracking {
70+
return Err(
71+
Error::custom("the `nested` argument can only be used if the module-level `experimental_conversion_tracking` flag is set")
72+
.with_span(&self.nested.span())
73+
);
74+
}
75+
76+
Ok(())
77+
}
6778
}

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,7 @@ impl Struct {
144144
self.fields
145145
.iter()
146146
.filter_map(|f| {
147-
f.generate_for_from_impl(
148-
direction,
149-
version,
150-
next_version,
151-
from_struct_ident,
152-
mod_gen_ctx,
153-
)
147+
f.generate_for_from_impl(direction, version, next_version, from_struct_ident)
154148
})
155149
.collect()
156150
};

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,17 @@ mod conversion;
2121
mod merge;
2222

2323
impl Container {
24-
pub fn new_struct(item_struct: ItemStruct, versions: &[VersionDefinition]) -> Result<Self> {
24+
pub fn new_struct(
25+
item_struct: ItemStruct,
26+
versions: &[VersionDefinition],
27+
experimental_conversion_tracking: bool,
28+
) -> Result<Self> {
2529
let attributes = ContainerAttributes::from_attributes(&item_struct.attrs)?;
2630

2731
let mut versioned_fields = Vec::new();
2832
for field in item_struct.fields {
29-
let mut versioned_field = VersionedField::new(field, versions)?;
33+
let mut versioned_field =
34+
VersionedField::new(field, versions, experimental_conversion_tracking)?;
3035
versioned_field.insert_container_versions(versions);
3136
versioned_fields.push(versioned_field);
3237
}
@@ -469,13 +474,7 @@ impl Struct {
469474
self.fields
470475
.iter()
471476
.filter_map(|f| {
472-
f.generate_for_from_impl(
473-
direction,
474-
version,
475-
next_version,
476-
from_struct_ident,
477-
mod_gen_ctx,
478-
)
477+
f.generate_for_from_impl(direction, version, next_version, from_struct_ident)
479478
})
480479
.collect()
481480
};

crates/stackable-versioned-macros/src/codegen/item/field.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,14 @@ pub struct VersionedField {
2626
}
2727

2828
impl VersionedField {
29-
pub fn new(field: Field, versions: &[VersionDefinition]) -> Result<Self> {
29+
pub fn new(
30+
field: Field,
31+
versions: &[VersionDefinition],
32+
experimental_conversion_tracking: bool,
33+
) -> Result<Self> {
3034
let field_attributes = FieldAttributes::from_field(&field)?;
3135
field_attributes.validate_versions(versions)?;
36+
field_attributes.validate_nested_flag(experimental_conversion_tracking)?;
3237

3338
let ident = field
3439
.ident
@@ -151,13 +156,7 @@ impl VersionedField {
151156
version: &VersionDefinition,
152157
next_version: &VersionDefinition,
153158
from_struct_ident: &IdentString,
154-
mod_gen_ctx: ModuleGenerationContext<'_>,
155159
) -> Option<TokenStream> {
156-
let experimental_conversion_tracking = mod_gen_ctx
157-
.kubernetes_options
158-
.experimental_conversion_tracking
159-
.is_present();
160-
161160
match &self.changes {
162161
Some(changes) => {
163162
let next_change = changes.get_expect(&next_version.inner);
@@ -196,7 +195,7 @@ impl VersionedField {
196195
}),
197196
// Default .into() call using From impls.
198197
None => {
199-
if self.nested && experimental_conversion_tracking {
198+
if self.nested {
200199
let json_path_ident = format_ident!(
201200
"__sv_{ident}_path",
202201
ident = to_ident.as_ident()
@@ -217,7 +216,7 @@ impl VersionedField {
217216
#from_ident: #downgrade_fn(#from_struct_ident.#to_ident),
218217
}),
219218
None => {
220-
if self.nested && experimental_conversion_tracking {
219+
if self.nested {
221220
let json_path_ident = format_ident!(
222221
"__sv_{ident}_path",
223222
ident = from_ident.as_ident()
@@ -243,7 +242,7 @@ impl VersionedField {
243242
// in some edge cases.
244243
match direction {
245244
Direction::Upgrade => {
246-
if self.nested && experimental_conversion_tracking {
245+
if self.nested {
247246
let json_path_ident = format_ident!(
248247
"__sv_{ident}_path",
249248
ident = next_field_ident.as_ident()
@@ -268,7 +267,7 @@ impl VersionedField {
268267
None => {
269268
let field_ident = &*self.ident;
270269

271-
if self.nested && experimental_conversion_tracking {
270+
if self.nested {
272271
let json_path_ident =
273272
format_ident!("__sv_{ident}_path", ident = field_ident.as_ident());
274273

crates/stackable-versioned-macros/src/codegen/module.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,17 @@ impl Module {
6060
};
6161
}
6262
Item::Struct(item_struct) => {
63-
if let Some(container) =
64-
errors.handle(Container::new_struct(item_struct, &versions))
65-
{
63+
let experimental_conversion_tracking = module_attributes
64+
.options
65+
.kubernetes
66+
.experimental_conversion_tracking
67+
.is_present();
68+
69+
if let Some(container) = errors.handle(Container::new_struct(
70+
item_struct,
71+
&versions,
72+
experimental_conversion_tracking,
73+
)) {
6674
containers.push(container);
6775
}
6876
}

0 commit comments

Comments
 (0)