Skip to content

Commit 25cd2a8

Browse files
Change maybe_from to try_from
Signed-off-by: Luca Della Vedova <lucadv@intrinsic.ai>
1 parent 3e2a7bf commit 25cd2a8

File tree

2 files changed

+106
-65
lines changed

2 files changed

+106
-65
lines changed

rclrs/src/parameter.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,9 @@ struct ParameterMap {
503503
impl<T: ParameterVariant> MandatoryParameter<T> {
504504
/// Returns a clone of the most recent value of the parameter.
505505
pub fn get(&self) -> T {
506-
T::maybe_from(self.value.read().unwrap().clone()).unwrap()
506+
T::try_from(self.value.read().unwrap().clone())
507+
.ok()
508+
.unwrap()
507509
}
508510

509511
/// Sets the parameter value.
@@ -519,7 +521,7 @@ impl<T: ParameterVariant> MandatoryParameter<T> {
519521
impl<T: ParameterVariant> ReadOnlyParameter<T> {
520522
/// Returns a clone of the most recent value of the parameter.
521523
pub fn get(&self) -> T {
522-
T::maybe_from(self.value.clone()).unwrap()
524+
T::try_from(self.value.clone()).ok().unwrap()
523525
}
524526
}
525527

@@ -530,7 +532,7 @@ impl<T: ParameterVariant> OptionalParameter<T> {
530532
.read()
531533
.unwrap()
532534
.clone()
533-
.map(|p| T::maybe_from(p).unwrap())
535+
.map(|p| T::try_from(p).ok().unwrap())
534536
}
535537

536538
/// Assigns a value to the optional parameter, setting it to `Some(value)`.
@@ -590,13 +592,13 @@ impl<'a> Parameters<'a> {
590592
};
591593
match storage {
592594
ParameterStorage::Declared(storage) => match &storage.value {
593-
DeclaredValue::Mandatory(p) => T::maybe_from(p.read().unwrap().clone()),
595+
DeclaredValue::Mandatory(p) => T::try_from(p.read().unwrap().clone()).ok(),
594596
DeclaredValue::Optional(p) => {
595-
p.read().unwrap().clone().and_then(|p| T::maybe_from(p))
597+
p.read().unwrap().clone().and_then(|p| T::try_from(p).ok())
596598
}
597-
DeclaredValue::ReadOnly(p) => T::maybe_from(p.clone()),
599+
DeclaredValue::ReadOnly(p) => T::try_from(p.clone()).ok(),
598600
},
599-
ParameterStorage::Undeclared(value) => T::maybe_from(value.clone()),
601+
ParameterStorage::Undeclared(value) => T::try_from(value.clone()).ok(),
600602
}
601603
}
602604

@@ -695,9 +697,10 @@ impl ParameterInterface {
695697
ranges
696698
.check_in_range(param_override)
697699
.map_err(DeclarationError::Override)?;
698-
value = Some(T::maybe_from(param_override.clone()).ok_or(
699-
DeclarationError::Override(ParameterValueError::TypeMismatch),
700-
)?);
700+
value = Some(
701+
T::try_from(param_override.clone())
702+
.map_err(|_| DeclarationError::Override(ParameterValueError::TypeMismatch))?,
703+
);
701704
}
702705
if let Some(current_value) = self._parameter_map.lock().unwrap().storage.get(name) {
703706
match current_value {
@@ -713,7 +716,7 @@ impl ParameterInterface {
713716
return Ok(value.map(|v| v.into()));
714717
}
715718
}
716-
if let Some(v) = T::maybe_from(param.clone()) {
719+
if let Ok(v) = T::try_from(param.clone()) {
717720
value = Some(v);
718721
} else if tentative {
719722
return Err(DeclarationError::PreexistingValue(

rclrs/src/parameter/value.rs

Lines changed: 92 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::ffi::CStr;
22
use std::sync::Arc;
33

44
use crate::rcl_bindings::*;
5-
use crate::{ParameterRange, ParameterRanges};
5+
use crate::{ParameterRange, ParameterRanges, ParameterValueError};
66

77
/// A parameter value.
88
///
@@ -132,138 +132,179 @@ impl From<Arc<[Arc<str>]>> for ParameterValue {
132132
}
133133

134134
/// 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> {
136136
/// The type used to describe the range of this parameter.
137137
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>;
142138

143139
/// Returns the `ParameterKind` of the implemented type.
144140
fn kind() -> ParameterKind;
145141
}
146142

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> {
150147
match value {
151-
ParameterValue::Bool(v) => Some(v),
152-
_ => None,
148+
ParameterValue::Bool(v) => Ok(v),
149+
_ => Err(ParameterValueError::TypeMismatch),
153150
}
154151
}
152+
}
153+
154+
impl ParameterVariant for bool {
155+
type Range = ();
155156

156157
fn kind() -> ParameterKind {
157158
ParameterKind::Bool
158159
}
159160
}
160161

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> {
164166
match value {
165-
ParameterValue::Integer(v) => Some(v),
166-
_ => None,
167+
ParameterValue::Integer(v) => Ok(v),
168+
_ => Err(ParameterValueError::TypeMismatch),
167169
}
168170
}
171+
}
172+
173+
impl ParameterVariant for i64 {
174+
type Range = ParameterRange<i64>;
169175

170176
fn kind() -> ParameterKind {
171177
ParameterKind::Integer
172178
}
173179
}
174180

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> {
178185
match value {
179-
ParameterValue::Double(v) => Some(v),
180-
_ => None,
186+
ParameterValue::Double(v) => Ok(v),
187+
_ => Err(ParameterValueError::TypeMismatch),
181188
}
182189
}
190+
}
191+
192+
impl ParameterVariant for f64 {
193+
type Range = ParameterRange<f64>;
183194

184195
fn kind() -> ParameterKind {
185196
ParameterKind::Double
186197
}
187198
}
188199

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> {
192204
match value {
193-
ParameterValue::String(v) => Some(v),
194-
_ => None,
205+
ParameterValue::String(v) => Ok(v),
206+
_ => Err(ParameterValueError::TypeMismatch),
195207
}
196208
}
209+
}
210+
211+
impl ParameterVariant for Arc<str> {
212+
type Range = ();
197213

198214
fn kind() -> ParameterKind {
199215
ParameterKind::String
200216
}
201217
}
202218

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> {
206223
match value {
207-
ParameterValue::ByteArray(v) => Some(v),
208-
_ => None,
224+
ParameterValue::ByteArray(v) => Ok(v),
225+
_ => Err(ParameterValueError::TypeMismatch),
209226
}
210227
}
228+
}
229+
230+
impl ParameterVariant for Arc<[u8]> {
231+
type Range = ();
211232

212233
fn kind() -> ParameterKind {
213234
ParameterKind::ByteArray
214235
}
215236
}
216237

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> {
220242
match value {
221-
ParameterValue::BoolArray(v) => Some(v),
222-
_ => None,
243+
ParameterValue::BoolArray(v) => Ok(v),
244+
_ => Err(ParameterValueError::TypeMismatch),
223245
}
224246
}
247+
}
248+
249+
impl ParameterVariant for Arc<[bool]> {
250+
type Range = ();
225251

226252
fn kind() -> ParameterKind {
227253
ParameterKind::BoolArray
228254
}
229255
}
230256

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> {
234261
match value {
235-
ParameterValue::IntegerArray(v) => Some(v),
236-
_ => None,
262+
ParameterValue::IntegerArray(v) => Ok(v),
263+
_ => Err(ParameterValueError::TypeMismatch),
237264
}
238265
}
266+
}
267+
268+
impl ParameterVariant for Arc<[i64]> {
269+
type Range = ();
239270

240271
fn kind() -> ParameterKind {
241272
ParameterKind::IntegerArray
242273
}
243274
}
244275

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> {
248280
match value {
249-
ParameterValue::DoubleArray(v) => Some(v),
250-
_ => None,
281+
ParameterValue::DoubleArray(v) => Ok(v),
282+
_ => Err(ParameterValueError::TypeMismatch),
251283
}
252284
}
285+
}
286+
287+
impl ParameterVariant for Arc<[f64]> {
288+
type Range = ();
253289

254290
fn kind() -> ParameterKind {
255291
ParameterKind::DoubleArray
256292
}
257293
}
258294

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> {
262299
match value {
263-
ParameterValue::StringArray(v) => Some(v),
264-
_ => None,
300+
ParameterValue::StringArray(v) => Ok(v),
301+
_ => Err(ParameterValueError::TypeMismatch),
265302
}
266303
}
304+
}
305+
306+
impl ParameterVariant for Arc<[Arc<str>]> {
307+
type Range = ();
267308

268309
fn kind() -> ParameterKind {
269310
ParameterKind::StringArray
@@ -272,9 +313,6 @@ impl ParameterVariant for Arc<[Arc<str>]> {
272313

273314
impl ParameterVariant for ParameterValue {
274315
type Range = ParameterRanges;
275-
fn maybe_from(value: ParameterValue) -> Option<Self> {
276-
Some(value)
277-
}
278316

279317
fn kind() -> ParameterKind {
280318
ParameterKind::Dynamic

0 commit comments

Comments
 (0)