From d42725060d1de96fddf90ecd3ea47f06fd91aa7a Mon Sep 17 00:00:00 2001 From: Max Audron Date: Tue, 4 Oct 2022 09:21:39 +0200 Subject: fix derive macros --- derive/src/lib.rs | 12 +++++++++--- derive/src/network/mod.rs | 14 ++++++++++++-- derive/src/setters/mod.rs | 12 ++++++++++-- 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, ty: syn::Type, #[darling(default)] - name: String, + name: Option, } 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, + #[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; -- cgit v1.2.3 atinator.git/commit/macros/src/macro_types/mod.rs?h=1.3.1&id=c34afc3f443d9a0744a45c988cd2ab8d93ee4160&follow=1'>add ability to use path and dotted syntax for functionsMax Audron-8/+39 2021-06-21publish macros subcrateMax Audron-20/+20 2021-06-13release version 1.2.1Max Audron-2/+2 * fix crash on empty message 2021-06-13fix crash on message only containing whitespaceMax Audron-1/+4 2021-06-11Release version 1.2.01.2.0Max Audron-2/+2 * add pet command 2021-06-06make pet more compactR0flcopt3r/catinator-pet-commandMax Audron-5/+5 2021-06-05feat: adds pet command.R0flcopt3r-0/+90 When petting the cat it will reply with some random action. 2021-06-05feat: send actionR0flcopt3r-1/+9 2021-06-05release version 1.1.0Max Audron-2/+2 2021-06-05document proc macrosMax Audron-4/+97 2021-06-05add intensifyMax Audron-3/+27 2021-06-05add privmsg macroMax Audron-2/+40 2021-06-05fix jb remote urlsMax Audron-4/+4 2021-06-05remove egress gateway configMax Audron-10/+0 2021-06-05update tanka dependenciesMax Audron-8/+8 2021-06-05fix init container nameMax Audron-1/+1 2021-06-05fix tanka dependency pathMax Audron-8/+8 2021-06-05switch to https url for tanka util libMax Audron-2/+2 2021-06-05bump version to 1.0.2Max Audron-2/+2 2021-06-05add tanka ci configurationMax Audron-1/+1 2021-06-05ready tanka deploy for CIMax Audron-32/+69 2021-06-05remove tanka vendoringMax Audron-27651/+0 2021-05-26Release 1.0.1Max Audron-3/+3 2021-05-26fix log breaking once buffer fullMax Audron-2/+33 the log_msg function was poping the newest message and replacing it with the newest message, it should be poping the oldest messages. 2021-05-16add deployment stuffMax Audron-6/+27786 2021-05-15add container buildMax Audron-2/+35 s='logmsg'> 2025-08-01add homepage dashboardMax Audron-3/+284 2025-08-01disable not used gameserversMax Audron-1/+2 2025-08-01add minecraft prometheus exporterMax Audron-3/+67 2025-08-01more monitoring & scrape config shortcutsMax Audron-68/+63 2025-08-01update garage to 2.0Max Audron-6/+10 2025-07-31fix authentik-ldap port bindingsMax Audron-0/+5 2025-07-31update to nixos 25.05Max Audron-113/+65 2025-07-31add more monitoring exporters and scrapersMax Audron-17/+57 2025-07-30try to run authentik nativelyMax Audron-26/+303 2025-07-30more metricsMax Audron-1/+41 2025-07-30enable firewallsMax Audron-1/+39