Skip to content

Commit 9c78df9

Browse files
committed
Pass value_changed to macro_rules! macros
In Rust, variable identifiers in a `macro_rules!` body are resolved in the scope of tht body - they cannot see through to the caller's body. For example, the following code errors: `rust macro_rules! weird_ident { () => { my_ident; } } fn main() { let my_ident = 1; weird_ident!(); } ` However, due to a compiler bug (rust-lang/rust#43081), this kind of code current compiles when a procedural macro is invoked by a `macro_rules!` macro. Eventually, this will cause a compilation error. In the `color!` and `slider!` macro, you're currently writing an expression involving `value_changed`, and passing it to a procedural macro (`html!`). However, `value_changed` comes from the body of the caller of `color!`/`slider!`, so this code will stop compiling once the compiler bug is fixed. Fortunately, the identifier of `value_changed` can be passed into `color!` and `slider!`. This modified code will with the current version of Rust, as well as future version that causes the old code into an error. I also ran `cargo update` to bump the dependencies in your Cargo.lock. This will allow your crate to continue to compile when the compiler bug is fixed, as you are depending on some crates (e.g. `syn`) that have released updates to address the issue. Feel free to ask me about any questions you may have. For more details, see rust-lang/rust#72622
1 parent adf4937 commit 9c78df9

File tree

8 files changed

+78
-78
lines changed

8 files changed

+78
-78
lines changed

Cargo.lock

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

src/color.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl Component for ColorPicker {
6060

6161
#[macro_export]
6262
macro_rules! color {
63-
( $name:expr, $value:expr ) => {
64-
html!(<ColorPicker name=$name value=&mut $value as *mut String value_changed=value_changed.clone() />)
63+
( $name:expr, $value:expr, $value_changed:expr) => {
64+
html!(<ColorPicker name=$name value=&mut $value as *mut String value_changed=$value_changed.clone() />)
6565
};
6666
}

src/parts/eyes.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ impl Eyes {
1818
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
1919
html!(
2020
<Group name="Eyes">
21-
{crate::color!("Color", self.color)}
22-
{crate::slider!("Width", 0.0, 6.0, self.size.0)}
23-
{crate::slider!("Height", 0.0, 3.0, self.size.1)}
24-
{crate::slider!("Separation", 0.0, 6.0, self.separation)}
21+
{crate::color!("Color", self.color, value_changed)}
22+
{crate::slider!("Width", 0.0, 6.0, self.size.0, value_changed)}
23+
{crate::slider!("Height", 0.0, 3.0, self.size.1, value_changed)}
24+
{crate::slider!("Separation", 0.0, 6.0, self.separation, value_changed)}
2525
<Group name="Brows">
26-
{crate::slider!("B1", 0.0, 2.0, self.brows.end_height.0)}
27-
{crate::slider!("B2", 0.0, 2.0, self.brows.curve)}
28-
{crate::slider!("B3", 0.0, 2.0, self.brows.end_height.1)}
26+
{crate::slider!("B1", 0.0, 2.0, self.brows.end_height.0, value_changed)}
27+
{crate::slider!("B2", 0.0, 2.0, self.brows.curve, value_changed)}
28+
{crate::slider!("B3", 0.0, 2.0, self.brows.end_height.1, value_changed)}
2929
</Group>
3030
</Group>
3131
)

src/parts/face.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ impl Forehead {
3636
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
3737
html!(
3838
<Group name="Forehead">
39-
{crate::slider!("RX", 0.0, 7.0, self.roundness.0)}
40-
{crate::slider!("RY", 0.0, 10.0, self.roundness.1)}
39+
{crate::slider!("RX", 0.0, 7.0, self.roundness.0, value_changed)}
40+
{crate::slider!("RY", 0.0, 10.0, self.roundness.1, value_changed)}
4141
</Group>
4242
)
4343
}
@@ -53,10 +53,10 @@ impl Fringe {
5353
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
5454
html!(
5555
<Group name="Fringe">
56-
{crate::color!("Color", self.hair_color)}
57-
{crate::slider!("Thickness", 0.0, 10.0, self.thickness)}
58-
{crate::slider!("RX", 0.0, 7.0, self.roundness.0)}
59-
{crate::slider!("RY", 0.0, 10.0, self.roundness.1)}
56+
{crate::color!("Color", self.hair_color, value_changed)}
57+
{crate::slider!("Thickness", 0.0, 10.0, self.thickness, value_changed)}
58+
{crate::slider!("RX", 0.0, 7.0, self.roundness.0, value_changed)}
59+
{crate::slider!("RY", 0.0, 10.0, self.roundness.1, value_changed)}
6060
</Group>
6161
)
6262
}
@@ -70,8 +70,8 @@ impl Chin {
7070
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
7171
html!(
7272
<Group name="Chin">
73-
{crate::slider!("RX", 0.0, 7.0, self.roundness.0)}
74-
{crate::slider!("RY", 0.0, 10.0, self.roundness.1)}
73+
{crate::slider!("RX", 0.0, 7.0, self.roundness.0, value_changed)}
74+
{crate::slider!("RY", 0.0, 10.0, self.roundness.1, value_changed)}
7575
</Group>
7676
)
7777
}
@@ -90,9 +90,9 @@ impl Face {
9090
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
9191
html!(
9292
<Group name="Face">
93-
{crate::color!("Skin", self.skin_color)}
94-
{crate::slider!("Width", 0.0, 16.0, self.width)}
95-
{crate::slider!("Height", 0.0, 32.0, self.height)}
93+
{crate::color!("Skin", self.skin_color, value_changed)}
94+
{crate::slider!("Width", 0.0, 16.0, self.width, value_changed)}
95+
{crate::slider!("Height", 0.0, 32.0, self.height, value_changed)}
9696
{self.forehead.controls(value_changed.clone())}
9797
{self.fringe.controls(value_changed.clone())}
9898
{self.chin.controls(value_changed.clone())}

src/parts/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl ScaledHead {
5353
html!(
5454
<>
5555
<Group name="Grid">
56-
{crate::slider!("Size", 8.0, 32.0, self.scale)}
56+
{crate::slider!("Size", 8.0, 32.0, self.scale, value_changed)}
5757
</Group>
5858
{self.head.controls(value_changed.clone())}
5959
</>

src/parts/mouth.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ impl TopLip {
1111
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
1212
html!(
1313
<Group name="Top Lip">
14-
{crate::slider!("RX", 0.0, 2.0, self.roundness.0)}
15-
{crate::slider!("RY", 0.0, 2.0, self.roundness.1)}
14+
{crate::slider!("RX", 0.0, 2.0, self.roundness.0, value_changed)}
15+
{crate::slider!("RY", 0.0, 2.0, self.roundness.1, value_changed)}
1616
<Group name="Philtrum">
17-
{crate::slider!("Width", 0.0, 1.0, self.philtrum.0)}
18-
{crate::slider!("Position", 0.0, 1.0, self.philtrum.1)}
17+
{crate::slider!("Width", 0.0, 1.0, self.philtrum.0, value_changed)}
18+
{crate::slider!("Position", 0.0, 1.0, self.philtrum.1, value_changed)}
1919
</Group>
2020
</Group>
2121
)
@@ -30,8 +30,8 @@ impl BottomLip {
3030
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
3131
html!(
3232
<Group name="Bottom Lip">
33-
{crate::slider!("RX", 0.0, 2.0, self.roundness.0)}
34-
{crate::slider!("RY", 0.0, 2.0, self.roundness.1)}
33+
{crate::slider!("RX", 0.0, 2.0, self.roundness.0, value_changed)}
34+
{crate::slider!("RY", 0.0, 2.0, self.roundness.1, value_changed)}
3535
</Group>
3636
)
3737
}
@@ -50,12 +50,12 @@ impl Mouth {
5050
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
5151
html!(
5252
<Group name="Mouth">
53-
{crate::color!("Color", self.color)}
53+
{crate::color!("Color", self.color, value_changed)}
5454
{self.top_lip.controls(value_changed.clone())}
5555
{self.bottom_lip.controls(value_changed.clone())}
5656
<Group name="Smile">
57-
{crate::slider!("Width", 0.0, 2.0, self.smile.0)}
58-
{crate::slider!("Height", 0.0, 2.0, self.smile.1)}
57+
{crate::slider!("Width", 0.0, 2.0, self.smile.0, value_changed)}
58+
{crate::slider!("Height", 0.0, 2.0, self.smile.1, value_changed)}
5959
</Group>
6060
</Group>
6161
)

src/parts/nose.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ impl Nose {
1616
pub fn controls(&mut self, value_changed: Callback<()>) -> Html {
1717
html!(
1818
<Group name="Nose">
19-
{crate::slider!("Width", 0.0, 4.0, self.width)}
20-
{crate::slider!("Height", 0.0, 5.0, self.height)}
19+
{crate::slider!("Width", 0.0, 4.0, self.width, value_changed)}
20+
{crate::slider!("Height", 0.0, 5.0, self.height, value_changed)}
2121
<Group name="Bridge">
2222
<Group name="Gap">
23-
{crate::slider!("X", 0.0, 2.0, self.bridge_gap.0)}
24-
{crate::slider!("Y", 0.0, 2.0, self.bridge_gap.1)}
23+
{crate::slider!("X", 0.0, 2.0, self.bridge_gap.0, value_changed)}
24+
{crate::slider!("Y", 0.0, 2.0, self.bridge_gap.1, value_changed)}
2525
</Group>
2626
<Group name="Top Curve">
27-
{crate::slider!("X", 0.0, 4.0, self.bridge_top_curve.0)}
28-
{crate::slider!("Y", 0.0, 4.0, self.bridge_top_curve.1)}
27+
{crate::slider!("X", 0.0, 4.0, self.bridge_top_curve.0, value_changed)}
28+
{crate::slider!("Y", 0.0, 4.0, self.bridge_top_curve.1, value_changed)}
2929
</Group>
3030
<Group name="Side Curve">
31-
{crate::slider!("X", 0.0, 1.0, self.bridge_side_curve.0)}
32-
{crate::slider!("Y", 0.0, 1.0, self.bridge_side_curve.1)}
31+
{crate::slider!("X", 0.0, 1.0, self.bridge_side_curve.0, value_changed)}
32+
{crate::slider!("Y", 0.0, 1.0, self.bridge_side_curve.1, value_changed)}
3333
</Group>
34-
{crate::slider!("Nostril", 0.0, 0.5, self.nostril_radius)}
35-
{crate::slider!("Tip", 0.0, 0.5, self.tip_curve)}
34+
{crate::slider!("Nostril", 0.0, 0.5, self.nostril_radius, value_changed)}
35+
{crate::slider!("Tip", 0.0, 0.5, self.tip_curve, value_changed)}
3636
</Group>
3737
</Group>
3838
)

src/slider.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ impl Component for Slider {
9898

9999
#[macro_export]
100100
macro_rules! slider {
101-
( $name:expr, $min:expr, $max:expr, $value:expr ) => {
102-
html!(<Slider name=$name min=$min max=$max value=&mut $value as *mut Value value_changed=value_changed.clone() />)
101+
( $name:expr, $min:expr, $max:expr, $value:expr, $value_changed:ident ) => {
102+
html!(<Slider name=$name min=$min max=$max value=&mut $value as *mut Value value_changed=$value_changed.clone() />)
103103
};
104104
}

0 commit comments

Comments
 (0)