aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2022-10-04 09:21:39 +0200
committerMax Audron <audron@cocaine.farm>2022-10-04 09:21:39 +0200
commitd42725060d1de96fddf90ecd3ea47f06fd91aa7a (patch)
tree262e0b384ec054cf7ccfb78d74b61507b5984b4f
parentadd session manager struct with default impls to handle sync and init (diff)
fix derive macros
-rw-r--r--derive/src/lib.rs12
-rw-r--r--derive/src/network/mod.rs14
-rw-r--r--derive/src/setters/mod.rs12
3 files changed, 31 insertions, 7 deletions
diff --git a/derive/src/lib.rs b/derive/src/lib.rs
index dc6e9fe..71feae7 100644
--- a/derive/src/lib.rs
+++ b/derive/src/lib.rs
@@ -20,11 +20,17 @@ pub fn from(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
from::from(input)
}
-#[proc_macro_derive(Setters, attributes(quassel))]
+#[proc_macro_derive(Setters, attributes(setter, quassel))]
pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
setters::setters(input)
}
+/// Sugar to make sending sync messages nicer
+///
+/// Example:
+/// ```
+/// sync!("requestCreateBufferView", [properties.to_network_map()])
+/// ```
#[proc_macro]
pub fn sync(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
sync::sync(input)
@@ -32,14 +38,14 @@ pub fn sync(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
use darling::FromField;
-#[derive(Debug, FromField)]
+#[derive(Debug, FromField, Clone)]
#[darling(attributes(quassel))]
struct QuasselField {
ident: Option<syn::Ident>,
ty: syn::Type,
#[darling(default)]
- name: String,
+ name: Option<String>,
}
impl QuasselField {
diff --git a/derive/src/network/mod.rs b/derive/src/network/mod.rs
index 7932a12..2d4c89d 100644
--- a/derive/src/network/mod.rs
+++ b/derive/src/network/mod.rs
@@ -91,7 +91,7 @@ pub fn network_map(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
.zip(quassel_fields)
.for_each(|(field, qfield)| {
if field.rename.is_none() {
- field.rename = Some(qfield.name)
+ field.rename = qfield.name
}
});
@@ -169,7 +169,17 @@ pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let _network = Network::from_derive_input(&input).unwrap();
- let fields = parse_fields(&input);
+ let mut fields = parse_fields(&input);
+ let quassel_fields = super::QuasselField::parse(&input);
+
+ fields
+ .iter_mut()
+ .zip(quassel_fields)
+ .for_each(|(field, qfield)| {
+ if field.rename.is_none() {
+ field.rename = qfield.name
+ }
+ });
let name = &input.ident;
diff --git a/derive/src/setters/mod.rs b/derive/src/setters/mod.rs
index 4436c3c..ac10144 100644
--- a/derive/src/setters/mod.rs
+++ b/derive/src/setters/mod.rs
@@ -6,6 +6,8 @@ use syn::{self, parse_macro_input};
#[derive(Debug, FromField)]
#[darling(attributes(setter))]
pub struct SetterField {
+ ident: Option<syn::Ident>,
+
#[darling(default)]
skip: bool,
@@ -45,8 +47,14 @@ pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
.zip(quassel_fields)
.filter(|(setter_field, _)| !setter_field.skip)
.map(|(setter_field, quassel_field)| {
+ let raw_name = if let Some(name) = &quassel_field.name {
+ name.clone()
+ } else {
+ setter_field.ident.as_ref().unwrap().to_string()
+ };
+
let name: String = {
- let mut name = quassel_field.name.chars();
+ let mut name = raw_name.chars();
format!(
"set{}{}",
@@ -63,7 +71,7 @@ pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
.unwrap_or({
let mut res = String::new();
- for c in quassel_field.name.chars().rev() {
+ for c in raw_name.chars().rev() {
if c <= 'Z' && c >= 'A' {
res.push(c.to_ascii_lowercase());
break;