@@ -2,7 +2,7 @@ use std::ffi::CStr;
2
2
use std:: sync:: Arc ;
3
3
4
4
use crate :: rcl_bindings:: * ;
5
- use crate :: { ParameterRange , ParameterRanges } ;
5
+ use crate :: { ParameterRange , ParameterRanges , ParameterValueError } ;
6
6
7
7
/// A parameter value.
8
8
///
@@ -132,138 +132,179 @@ impl From<Arc<[Arc<str>]>> for ParameterValue {
132
132
}
133
133
134
134
/// A trait that describes a value that can be converted into a parameter.
135
- pub trait ParameterVariant : Into < ParameterValue > + Clone {
135
+ pub trait ParameterVariant : Into < ParameterValue > + Clone + TryFrom < ParameterValue > {
136
136
/// The type used to describe the range of this parameter.
137
137
type Range : Into < ParameterRanges > + Default + Clone ;
138
- /// Attempts to convert `value` into the requested type.
139
- /// Returns `Some(Self)` if the conversion was successful, `None` otherwise.
140
- // TODO(luca) should we use try_from?
141
- fn maybe_from ( value : ParameterValue ) -> Option < Self > ;
142
138
143
139
/// Returns the `ParameterKind` of the implemented type.
144
140
fn kind ( ) -> ParameterKind ;
145
141
}
146
142
147
- impl ParameterVariant for bool {
148
- type Range = ( ) ;
149
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
143
+ impl TryFrom < ParameterValue > for bool {
144
+ type Error = ParameterValueError ;
145
+
146
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
150
147
match value {
151
- ParameterValue :: Bool ( v) => Some ( v) ,
152
- _ => None ,
148
+ ParameterValue :: Bool ( v) => Ok ( v) ,
149
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
153
150
}
154
151
}
152
+ }
153
+
154
+ impl ParameterVariant for bool {
155
+ type Range = ( ) ;
155
156
156
157
fn kind ( ) -> ParameterKind {
157
158
ParameterKind :: Bool
158
159
}
159
160
}
160
161
161
- impl ParameterVariant for i64 {
162
- type Range = ParameterRange < i64 > ;
163
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
162
+ impl TryFrom < ParameterValue > for i64 {
163
+ type Error = ParameterValueError ;
164
+
165
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
164
166
match value {
165
- ParameterValue :: Integer ( v) => Some ( v) ,
166
- _ => None ,
167
+ ParameterValue :: Integer ( v) => Ok ( v) ,
168
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
167
169
}
168
170
}
171
+ }
172
+
173
+ impl ParameterVariant for i64 {
174
+ type Range = ParameterRange < i64 > ;
169
175
170
176
fn kind ( ) -> ParameterKind {
171
177
ParameterKind :: Integer
172
178
}
173
179
}
174
180
175
- impl ParameterVariant for f64 {
176
- type Range = ParameterRange < f64 > ;
177
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
181
+ impl TryFrom < ParameterValue > for f64 {
182
+ type Error = ParameterValueError ;
183
+
184
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
178
185
match value {
179
- ParameterValue :: Double ( v) => Some ( v) ,
180
- _ => None ,
186
+ ParameterValue :: Double ( v) => Ok ( v) ,
187
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
181
188
}
182
189
}
190
+ }
191
+
192
+ impl ParameterVariant for f64 {
193
+ type Range = ParameterRange < f64 > ;
183
194
184
195
fn kind ( ) -> ParameterKind {
185
196
ParameterKind :: Double
186
197
}
187
198
}
188
199
189
- impl ParameterVariant for Arc < str > {
190
- type Range = ( ) ;
191
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
200
+ impl TryFrom < ParameterValue > for Arc < str > {
201
+ type Error = ParameterValueError ;
202
+
203
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
192
204
match value {
193
- ParameterValue :: String ( v) => Some ( v) ,
194
- _ => None ,
205
+ ParameterValue :: String ( v) => Ok ( v) ,
206
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
195
207
}
196
208
}
209
+ }
210
+
211
+ impl ParameterVariant for Arc < str > {
212
+ type Range = ( ) ;
197
213
198
214
fn kind ( ) -> ParameterKind {
199
215
ParameterKind :: String
200
216
}
201
217
}
202
218
203
- impl ParameterVariant for Arc < [ u8 ] > {
204
- type Range = ( ) ;
205
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
219
+ impl TryFrom < ParameterValue > for Arc < [ u8 ] > {
220
+ type Error = ParameterValueError ;
221
+
222
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
206
223
match value {
207
- ParameterValue :: ByteArray ( v) => Some ( v) ,
208
- _ => None ,
224
+ ParameterValue :: ByteArray ( v) => Ok ( v) ,
225
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
209
226
}
210
227
}
228
+ }
229
+
230
+ impl ParameterVariant for Arc < [ u8 ] > {
231
+ type Range = ( ) ;
211
232
212
233
fn kind ( ) -> ParameterKind {
213
234
ParameterKind :: ByteArray
214
235
}
215
236
}
216
237
217
- impl ParameterVariant for Arc < [ bool ] > {
218
- type Range = ( ) ;
219
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
238
+ impl TryFrom < ParameterValue > for Arc < [ bool ] > {
239
+ type Error = ParameterValueError ;
240
+
241
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
220
242
match value {
221
- ParameterValue :: BoolArray ( v) => Some ( v) ,
222
- _ => None ,
243
+ ParameterValue :: BoolArray ( v) => Ok ( v) ,
244
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
223
245
}
224
246
}
247
+ }
248
+
249
+ impl ParameterVariant for Arc < [ bool ] > {
250
+ type Range = ( ) ;
225
251
226
252
fn kind ( ) -> ParameterKind {
227
253
ParameterKind :: BoolArray
228
254
}
229
255
}
230
256
231
- impl ParameterVariant for Arc < [ i64 ] > {
232
- type Range = ( ) ;
233
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
257
+ impl TryFrom < ParameterValue > for Arc < [ i64 ] > {
258
+ type Error = ParameterValueError ;
259
+
260
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
234
261
match value {
235
- ParameterValue :: IntegerArray ( v) => Some ( v) ,
236
- _ => None ,
262
+ ParameterValue :: IntegerArray ( v) => Ok ( v) ,
263
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
237
264
}
238
265
}
266
+ }
267
+
268
+ impl ParameterVariant for Arc < [ i64 ] > {
269
+ type Range = ( ) ;
239
270
240
271
fn kind ( ) -> ParameterKind {
241
272
ParameterKind :: IntegerArray
242
273
}
243
274
}
244
275
245
- impl ParameterVariant for Arc < [ f64 ] > {
246
- type Range = ( ) ;
247
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
276
+ impl TryFrom < ParameterValue > for Arc < [ f64 ] > {
277
+ type Error = ParameterValueError ;
278
+
279
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
248
280
match value {
249
- ParameterValue :: DoubleArray ( v) => Some ( v) ,
250
- _ => None ,
281
+ ParameterValue :: DoubleArray ( v) => Ok ( v) ,
282
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
251
283
}
252
284
}
285
+ }
286
+
287
+ impl ParameterVariant for Arc < [ f64 ] > {
288
+ type Range = ( ) ;
253
289
254
290
fn kind ( ) -> ParameterKind {
255
291
ParameterKind :: DoubleArray
256
292
}
257
293
}
258
294
259
- impl ParameterVariant for Arc < [ Arc < str > ] > {
260
- type Range = ( ) ;
261
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
295
+ impl TryFrom < ParameterValue > for Arc < [ Arc < str > ] > {
296
+ type Error = ParameterValueError ;
297
+
298
+ fn try_from ( value : ParameterValue ) -> Result < Self , Self :: Error > {
262
299
match value {
263
- ParameterValue :: StringArray ( v) => Some ( v) ,
264
- _ => None ,
300
+ ParameterValue :: StringArray ( v) => Ok ( v) ,
301
+ _ => Err ( ParameterValueError :: TypeMismatch ) ,
265
302
}
266
303
}
304
+ }
305
+
306
+ impl ParameterVariant for Arc < [ Arc < str > ] > {
307
+ type Range = ( ) ;
267
308
268
309
fn kind ( ) -> ParameterKind {
269
310
ParameterKind :: StringArray
@@ -272,9 +313,6 @@ impl ParameterVariant for Arc<[Arc<str>]> {
272
313
273
314
impl ParameterVariant for ParameterValue {
274
315
type Range = ParameterRanges ;
275
- fn maybe_from ( value : ParameterValue ) -> Option < Self > {
276
- Some ( value)
277
- }
278
316
279
317
fn kind ( ) -> ParameterKind {
280
318
ParameterKind :: Dynamic
0 commit comments