@@ -91,6 +91,45 @@ macro_rules! spi_transaction_helper {
91
91
}
92
92
} )
93
93
} ;
94
+ ( $device: expr, move |$bus: ident| async $closure_body: expr) => {
95
+ $crate:: spi:: SpiDevice :: transaction( $device, move |$bus| {
96
+ // Safety: Implementers of the `SpiDevice` trait guarantee that the pointer is
97
+ // valid and dereferencable for the entire duration of the closure.
98
+ let $bus = unsafe { & mut * $bus } ;
99
+ async {
100
+ let result = $closure_body;
101
+ let $bus = $bus; // Ensure that the bus reference was not moved out of the closure
102
+ let _ = $bus; // Silence the "unused variable" warning from prevous line
103
+ result
104
+ }
105
+ } )
106
+ } ;
107
+ ( $device: expr, |$bus: ident| async move $closure_body: expr) => {
108
+ $crate:: spi:: SpiDevice :: transaction( $device, |$bus| {
109
+ // Safety: Implementers of the `SpiDevice` trait guarantee that the pointer is
110
+ // valid and dereferencable for the entire duration of the closure.
111
+ let $bus = unsafe { & mut * $bus } ;
112
+ async move {
113
+ let result = $closure_body;
114
+ let $bus = $bus; // Ensure that the bus reference was not moved out of the closure
115
+ let _ = $bus; // Silence the "unused variable" warning from prevous line
116
+ result
117
+ }
118
+ } )
119
+ } ;
120
+ ( $device: expr, |$bus: ident| async $closure_body: expr) => {
121
+ $crate:: spi:: SpiDevice :: transaction( $device, |$bus| {
122
+ // Safety: Implementers of the `SpiDevice` trait guarantee that the pointer is
123
+ // valid and dereferencable for the entire duration of the closure.
124
+ let $bus = unsafe { & mut * $bus } ;
125
+ async {
126
+ let result = $closure_body;
127
+ let $bus = $bus; // Ensure that the bus reference was not moved out of the closure
128
+ let _ = $bus; // Silence the "unused variable" warning from prevous line
129
+ result
130
+ }
131
+ } )
132
+ } ;
94
133
}
95
134
96
135
#[ doc( inline) ]
0 commit comments