From f07ac5d679f33cb0da1da2aef53abb7efce3caad Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 17 Jun 2020 19:08:26 +0200 Subject: [PATCH] Commit missing matrix_sdk_common_macros folder --- matrix_sdk_common_macros/Cargo.toml | 18 +++++++++++++++++ matrix_sdk_common_macros/src/lib.rs | 30 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 matrix_sdk_common_macros/Cargo.toml create mode 100644 matrix_sdk_common_macros/src/lib.rs diff --git a/matrix_sdk_common_macros/Cargo.toml b/matrix_sdk_common_macros/Cargo.toml new file mode 100644 index 00000000..3df8a0bf --- /dev/null +++ b/matrix_sdk_common_macros/Cargo.toml @@ -0,0 +1,18 @@ +[package] +description = "Helper macros for the Matrix SDK" +authors = ["MTRnord "] +edition = "2018" +homepage = "https://github.com/matrix-org/matrix-rust-sdk" +keywords = ["matrix", "chat", "messaging", "ruma"] +license = "Apache-2.0" +name = "matrix-sdk-common-macros" +readme = "README.md" +repository = "https://github.com/matrix-org/matrix-rust-sdk" +version = "0.1.0" + +[lib] +proc-macro = true + +[dependencies] +syn = "1.0" +quote = "1.0" diff --git a/matrix_sdk_common_macros/src/lib.rs b/matrix_sdk_common_macros/src/lib.rs new file mode 100644 index 00000000..31564805 --- /dev/null +++ b/matrix_sdk_common_macros/src/lib.rs @@ -0,0 +1,30 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, parse_quote, ItemTrait}; + +/// Attribute to use `Send + Sync` for everything but wasm32 +#[proc_macro_attribute] +pub fn send_sync(_attr: TokenStream, input: TokenStream) -> TokenStream { + // Parse the input tokens into a syntax tree + let mut input = parse_macro_input!(input as ItemTrait); + + let send_trait_bound = parse_quote!(std::marker::Send); + let sync_trait_bound = parse_quote!(std::marker::Sync); + input.supertraits.push(send_trait_bound); + input.supertraits.push(sync_trait_bound); + + TokenStream::from(quote!(#input)) +} + +/// A wasm32 compatible wrapper for the async_trait::async_trait macro +#[proc_macro_attribute] +pub fn async_trait(_attr: TokenStream, item: TokenStream) -> TokenStream { + let attrs = r#" + #[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))] + #[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)] + "#; + + let mut out: TokenStream = attrs.parse().unwrap(); + out.extend(item); + out +}