Skip to content

Commit 6616988

Browse files
support discimator function
1 parent 74cf511 commit 6616988

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

rclrs-macros/src/impl.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ fn derive_structured_parameters_struct(
3333
let mut constraints: Option<Expr> = None;
3434
let mut ignore_override = false;
3535
let mut discard_mismatching_prior_value = false;
36+
let mut discriminate: Option<Expr> = None;
3637

3738
for attr in &f.attrs {
3839
if attr.path().is_ident("param") {
@@ -52,6 +53,9 @@ fn derive_structured_parameters_struct(
5253
} else if meta.path.is_ident("discard_mismatching_prior_value") {
5354
discard_mismatching_prior_value = true;
5455
Ok(())
56+
} else if meta.path.is_ident("discriminate") {
57+
discriminate = Some(meta.value()?.parse()?);
58+
Ok(())
5559
} else {
5660
let err = format!("Unknown key: {:?}", &meta.path.get_ident());
5761
syn::Result::Err(syn::Error::new_spanned(meta.path, err))
@@ -72,6 +76,12 @@ fn derive_structured_parameters_struct(
7276
Some(expr) => quote! {#expr},
7377
None => quote! {""},
7478
};
79+
let discriminate = match discriminate {
80+
Some(expr) => quote! {
81+
core::option::Option::Some(Box::new(#expr))
82+
},
83+
None => quote! {core::option::Option::None},
84+
};
7585

7686
let field_type = match &f.ty {
7787
syn::Type::Path(p) => {
@@ -100,6 +110,7 @@ fn derive_structured_parameters_struct(
100110
#constraints,
101111
#ignore_override,
102112
#discard_mismatching_prior_value,
113+
#discriminate,
103114

104115
)?,
105116
};
@@ -119,13 +130,14 @@ fn derive_structured_parameters_struct(
119130
fn declare_structured_(
120131
node: &rclrs::NodeState,
121132
name: &str,
122-
default: Option<DefaultForbidden>,
123-
description: impl Into<std::sync::Arc<str>>,
124-
constraints: impl Into<std::sync::Arc<str>>,
133+
default: core::option::Option<rclrs::structured::DefaultForbidden>,
134+
description: impl core::convert::Into<std::sync::Arc<str>>,
135+
constraints: impl core::convert::Into<std::sync::Arc<str>>,
125136
ignore_override: bool,
126137
discard_mismatching_prior_value: bool,
138+
discriminate: core::option::Option<Box<dyn core::ops::function::FnOnce(rclrs::AvailableValues<T>) -> core::option::Option<T>>>,
127139
)
128-
-> core::result::Result<Self, crate::DeclarationError> {
140+
-> core::result::Result<Self, rclrs::DeclarationError> {
129141
core::result::Result::Ok(Self{ #(#args)*})
130142
}
131143

rclrs/src/parameter/structured.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub trait StructuredParameters: Sized {
3333
constraints: impl Into<std::sync::Arc<str>>,
3434
ignore_override: bool,
3535
discard_mismatching_prior_value: bool,
36+
discriminate: Option<Box<dyn FnOnce(crate::AvailableValues<T>) -> Option<T>>>,
3637
) -> core::result::Result<Self, crate::DeclarationError>
3738
where
3839
Self: StructuredParametersMeta<T>,
@@ -45,6 +46,7 @@ pub trait StructuredParameters: Sized {
4546
constraints,
4647
ignore_override,
4748
discard_mismatching_prior_value,
49+
discriminate,
4850
)
4951
}
5052
}
@@ -70,6 +72,7 @@ pub trait StructuredParametersMeta<T>: Sized {
7072
constraints: impl Into<std::sync::Arc<str>>,
7173
ignore_override: bool,
7274
discard_mismatching_prior_value: bool,
75+
discriminate: Option<Box<dyn FnOnce(crate::AvailableValues<T>) -> Option<T>>>,
7376
) -> core::result::Result<Self, crate::DeclarationError>;
7477
}
7578

@@ -83,7 +86,7 @@ impl NodeState {
8386
where
8487
T: StructuredParameters + StructuredParametersMeta<T0>,
8588
{
86-
T::declare_structured(self, name, None, "", "", false, false)
89+
T::declare_structured(self, name, None, "", "", false, false, None)
8790
}
8891
}
8992

@@ -97,6 +100,7 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::Mandator
97100
constraints: impl Into<std::sync::Arc<str>>,
98101
ignore_override: bool,
99102
discard_mismatching_prior_value: bool,
103+
discriminate: Option<Box<dyn FnOnce(crate::AvailableValues<T>) -> Option<T>>>,
100104
) -> core::result::Result<Self, crate::DeclarationError> {
101105
let builder = node.declare_parameter(name);
102106
let builder = match default {
@@ -111,6 +115,12 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::Mandator
111115
true => builder.discard_mismatching_prior_value(),
112116
false => builder,
113117
};
118+
let builder = match discriminate {
119+
Some(f) => builder.discriminate(f),
120+
None => builder,
121+
};
122+
//builder.range(range)
123+
114124
builder
115125
.description(description)
116126
.constraints(constraints)
@@ -127,6 +137,7 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::ReadOnly
127137
constraints: impl Into<std::sync::Arc<str>>,
128138
ignore_override: bool,
129139
discard_mismatching_prior_value: bool,
140+
discriminate: Option<Box<dyn FnOnce(crate::AvailableValues<T>) -> Option<T>>>,
130141
) -> core::result::Result<Self, crate::DeclarationError> {
131142
let builder = node.declare_parameter(name);
132143
let builder = match default {
@@ -141,6 +152,10 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::ReadOnly
141152
true => builder.discard_mismatching_prior_value(),
142153
false => builder,
143154
};
155+
let builder = match discriminate {
156+
Some(f) => builder.discriminate(f),
157+
None => builder,
158+
};
144159
builder
145160
.description(description)
146161
.constraints(constraints)
@@ -157,6 +172,7 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::Optional
157172
constraints: impl Into<std::sync::Arc<str>>,
158173
ignore_override: bool,
159174
discard_mismatching_prior_value: bool,
175+
discriminate: Option<Box<dyn FnOnce(crate::AvailableValues<T>) -> Option<T>>>,
160176
) -> core::result::Result<Self, crate::DeclarationError> {
161177
let builder = node.declare_parameter(name);
162178
let builder = match default {
@@ -171,9 +187,10 @@ impl<T: crate::ParameterVariant> StructuredParametersMeta<T> for crate::Optional
171187
true => builder.discard_mismatching_prior_value(),
172188
false => builder,
173189
};
174-
175-
//builder.discriminate(f)
176-
//builder.range(range)
190+
let builder = match discriminate {
191+
Some(f) => builder.discriminate(f),
192+
None => builder,
193+
};
177194

178195
builder
179196
.description(description)

0 commit comments

Comments
 (0)