atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: bindings/matrix-sdk-ffi-macros/src/lib.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2024 The Matrix.org Foundation C.I.C.
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// See the License for the specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
use proc_macro::TokenStream;
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
use quote::quote;
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
use syn::{ImplItem, Item, TraitItem};
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
/// Attribute to specify the async runtime parameter for the `uniffi`
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
/// export macros if there any `async fn`s in the input.
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
#[proc_macro_attribute]
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
pub fn export(attr: TokenStream, item: TokenStream) -> TokenStream {
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
    let has_async_fn = |item| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
        if let Item::Fn(fun) = &item {
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
            if fun.sig.asyncness.is_some() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
                return true;
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
        } else if let Item::Impl(blk) = &item {
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
            for item in &blk.items {
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
                if let ImplItem::Fn(fun) = item
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
                    && fun.sig.asyncness.is_some()
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
                {
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
                    return true;
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
        } else if let Item::Trait(blk) = &item {
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
            for item in &blk.items {
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
                if let TraitItem::Fn(fun) = item
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
                    && fun.sig.asyncness.is_some()
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
                {
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
                    return true;
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
        false
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    let attr2 = proc_macro2::TokenStream::from(attr);
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    let item2 = proc_macro2::TokenStream::from(item.clone());
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    let res = match syn::parse(item) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
        Ok(item) => match has_async_fn(item) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
            true => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
                quote! {
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
                  #[cfg_attr(target_family = "wasm", uniffi::export(#attr2))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
                  #[cfg_attr(not(target_family = "wasm"), uniffi::export(async_runtime = "tokio", #attr2))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
            false => quote! { #[uniffi::export(#attr2)] },
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
        Err(e) => e.into_compile_error(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
    quote! {
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
        #res
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
        #item2
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    .into()
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
}