Skip to content

Commit 5e7042a

Browse files
committed
Fix IntoParts implementation
1 parent 7b126a8 commit 5e7042a

File tree

5 files changed

+94
-29
lines changed

5 files changed

+94
-29
lines changed

execution-plan-macros/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ authors = ["Adam Chalmers"]
1111
[dependencies]
1212
proc-macro2 = "1.0.70"
1313
quote = "1.0.33"
14-
syn = "2.0.41"
14+
syn = { version = "2.0.41", features = ["extra-traits"] }
1515

1616
[lib]
1717
proc-macro = true

execution-plan-macros/src/lib.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ fn impl_value_on_enum(
5252
#name::#variant_name{#(#field_idents),*}
5353
},
5454
quote_spanned! {expr.span()=>
55-
vec![
56-
Primitive::from(stringify!(#variant_name).to_owned()),
57-
#(Primitive::from(#field_idents),)*
58-
]
55+
let mut parts = Vec::new();
56+
parts.push(kittycad_execution_plan_traits::Primitive::from(stringify!(#variant_name).to_owned()));
57+
#(parts.extend(#field_idents.into_parts());)*
58+
parts
5959
},
6060
)
6161
}
@@ -76,10 +76,10 @@ fn impl_value_on_enum(
7676
#name::#variant_name(#(#placeholder_field_idents),*)
7777
},
7878
quote_spanned! {expr.span() =>
79-
vec![
80-
Primitive::from(stringify!(#variant_name).to_owned()),
81-
#(Primitive::from(#placeholder_field_idents),)*
82-
]
79+
let mut parts = Vec::new();
80+
parts.push(kittycad_execution_plan_traits::Primitive::from(stringify!(#variant_name).to_owned()));
81+
#(parts.extend(#placeholder_field_idents.into_parts());)*
82+
parts
8383
},
8484
)
8585
}
@@ -113,7 +113,7 @@ fn impl_value_on_enum(
113113
let (field_idents, field_types): (Vec<_>, Vec<_>) = expr
114114
.named
115115
.iter()
116-
.filter_map(|named| named.ident.as_ref().map(|id| (id, &named.ty)))
116+
.filter_map(|named| named.ident.as_ref().map(|id| (id, remove_generics(named.ty.clone()))))
117117
.unzip();
118118
let rhs = quote_spanned! {expr.span()=>
119119
#(let #field_idents = #field_types::from_parts(values)?;)*
@@ -195,6 +195,17 @@ fn impl_value_on_enum(
195195
}
196196
}
197197

198+
fn remove_generics(mut ty: syn::Type) -> syn::Type {
199+
if let syn::Type::Path(ref mut p) = ty {
200+
for segment in p.path.segments.iter_mut() {
201+
if let syn::PathArguments::AngleBracketed(ref mut _a) = segment.arguments {
202+
segment.arguments = syn::PathArguments::None;
203+
}
204+
}
205+
}
206+
ty
207+
}
208+
198209
fn impl_value_on_struct(
199210
span: Span,
200211
name: proc_macro2::Ident,
@@ -299,6 +310,19 @@ mod tests {
299310
insta::assert_snapshot!(formatted);
300311
}
301312

313+
#[test]
314+
fn test_enum_with_generics() {
315+
let input = quote! {
316+
enum Segment {
317+
Line { point: Point3d<f64> }
318+
}
319+
};
320+
let input: DeriveInput = syn::parse2(input).unwrap();
321+
let out = impl_derive_value(input);
322+
let formatted = get_text_fmt(&out).unwrap();
323+
insta::assert_snapshot!(formatted);
324+
}
325+
302326
fn clean_text(s: &str) -> String {
303327
// Add newlines after end-braces at <= two levels of indentation.
304328
if cfg!(not(windows)) {

execution-plan-macros/src/snapshots/kittycad_execution_plan_macros__tests__enum.snap

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ impl kittycad_execution_plan_traits::Value for FooEnum {
77
match self {
88
FooEnum::A { x } => {
99
vec![
10-
Primitive::from(stringify!(A).to_owned()),
11-
Primitive::from(x),
10+
kittycad_execution_plan_traits::Primitive::from(stringify!(A).to_owned()),
11+
kittycad_execution_plan_traits::Primitive::from(x),
1212
]
1313
}
1414
FooEnum::B { y } => {
1515
vec![
16-
Primitive::from(stringify!(B).to_owned()),
17-
Primitive::from(y),
16+
kittycad_execution_plan_traits::Primitive::from(stringify!(B).to_owned()),
17+
kittycad_execution_plan_traits::Primitive::from(y),
1818
]
1919
}
2020
FooEnum::C(field0, field1) => {
2121
vec![
22-
Primitive::from(stringify!(C).to_owned()),
23-
Primitive::from(field0),
24-
Primitive::from(field1),
22+
kittycad_execution_plan_traits::Primitive::from(stringify!(C).to_owned()),
23+
kittycad_execution_plan_traits::Primitive::from(field0),
24+
kittycad_execution_plan_traits::Primitive::from(field1),
2525
]
2626
}
2727
FooEnum::D => Vec::new(),
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
source: execution-plan-macros/src/lib.rs
3+
assertion_line: 324
4+
expression: formatted
5+
---
6+
impl kittycad_execution_plan_traits::Value for Segment {
7+
fn into_parts(self) -> Vec<kittycad_execution_plan_traits::Primitive> {
8+
match self {
9+
Segment::Line { point } => {
10+
vec![
11+
kittycad_execution_plan_traits::Primitive::from(stringify!(Line).to_owned()),
12+
kittycad_execution_plan_traits::Primitive::from(point),
13+
]
14+
}
15+
}
16+
}
17+
18+
fn from_parts<I>(values: &mut I) -> Result<Self, kittycad_execution_plan_traits::MemoryError>
19+
where
20+
I: Iterator<Item = Option<kittycad_execution_plan_traits::Primitive>>,
21+
{
22+
let variant_name = String::from_parts(values)?;
23+
match variant_name.as_str() {
24+
stringify!(Line) => {
25+
let point = Point3d::from_parts(values)?;
26+
Ok(Self::Line { point })
27+
}
28+
other => Err(
29+
kittycad_execution_plan_traits::MemoryError::InvalidEnumVariant {
30+
expected_type: stringify!(Segment).to_owned(),
31+
actual: other.to_owned(),
32+
},
33+
),
34+
}
35+
}
36+
}
37+

execution-plan-macros/tests/main.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,4 @@
11
use kittycad_execution_plan_macros::ExecutionPlanValue;
2-
use kittycad_execution_plan_traits::{Primitive, Value};
3-
4-
#[derive(ExecutionPlanValue)]
5-
struct FooGenericWithDefault<T = f32>
6-
where
7-
Primitive: From<T>,
8-
T: Value,
9-
{
10-
f: f64,
11-
i: usize,
12-
t: T,
13-
}
142

153
#[derive(ExecutionPlanValue)]
164
struct FooConcrete {
@@ -25,3 +13,19 @@ enum FooEnum {
2513
C(usize, String, f64, f32),
2614
D,
2715
}
16+
17+
mod generics {
18+
use kittycad_execution_plan_macros::ExecutionPlanValue;
19+
use kittycad_execution_plan_traits::{Primitive, Value};
20+
21+
#[derive(ExecutionPlanValue)]
22+
struct FooGenericWithDefault<T = f32>
23+
where
24+
Primitive: From<T>,
25+
T: Value,
26+
{
27+
f: f64,
28+
i: usize,
29+
t: T,
30+
}
31+
}

0 commit comments

Comments
 (0)