aboutsummaryrefslogtreecommitdiff
path: root/derive/src/setters
diff options
context:
space:
mode:
Diffstat (limited to 'derive/src/setters')
-rw-r--r--derive/src/setters/mod.rs48
1 files changed, 28 insertions, 20 deletions
diff --git a/derive/src/setters/mod.rs b/derive/src/setters/mod.rs
index ac10144..b3d2dd1 100644
--- a/derive/src/setters/mod.rs
+++ b/derive/src/setters/mod.rs
@@ -16,6 +16,10 @@ pub struct SetterField {
/// mainly to show up in the docs
/// by default using the last word of the name
var_name: Option<syn::Ident>,
+
+ #[darling(default)]
+ /// Override the name of the function if the desired name does not match the variable name.
+ name: Option<syn::Ident>,
}
impl SetterField {
@@ -25,9 +29,7 @@ impl SetterField {
syn::Fields::Named(fields) => fields
.named
.iter()
- .map(|field| {
- SetterField::from_field(field).expect("Could not parse setter field")
- })
+ .map(|field| SetterField::from_field(field).expect("Could not parse setter field"))
.collect(),
_ => panic!("setter: not a named field"),
},
@@ -64,24 +66,20 @@ pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
};
let var_name = syn::Ident::new(
- &setter_field
- .var_name
- .as_ref()
- .map(|v| v.to_string())
- .unwrap_or({
- let mut res = String::new();
-
- for c in raw_name.chars().rev() {
- if c <= 'Z' && c >= 'A' {
- res.push(c.to_ascii_lowercase());
- break;
- } else {
- res.push(c);
- }
+ &setter_field.var_name.as_ref().map(|v| v.to_string()).unwrap_or({
+ let mut res = String::new();
+
+ for c in raw_name.chars().rev() {
+ if c <= 'Z' && c >= 'A' {
+ res.push(c.to_ascii_lowercase());
+ break;
+ } else {
+ res.push(c);
}
+ }
- res.chars().rev().collect()
- }),
+ res.chars().rev().collect()
+ }),
Span::call_site(),
);
@@ -91,7 +89,17 @@ pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
.expect("failed to get quassel field ident");
let ty = &quassel_field.ty;
- let fn_name = syn::Ident::new(&format!("set_{}", ident), Span::call_site());
+ let fn_ident = if let Some(name) = setter_field.name.clone() {
+ name
+ } else {
+ quassel_field
+ .ident
+ .as_ref()
+ .expect("failed to get quassel field ident")
+ .clone()
+ };
+
+ let fn_name = syn::Ident::new(&format!("set_{}", fn_ident), Span::call_site());
quote! {
pub fn #fn_name(&mut self, #var_name: #ty) {