#async-version #sync #await #macro #function #suffix #modifier

macro syncify

A simple macro for writing async functions once and getting both the async version and a sync version that strips all async function modifiers and all .await suffixes

1 unstable release

0.1.0 Jul 30, 2024

#1685 in Procedural macros

Download history 115/week @ 2024-07-26 29/week @ 2024-08-02 357/week @ 2024-08-09 181/week @ 2024-08-16 302/week @ 2024-08-23 110/week @ 2024-08-30 171/week @ 2024-09-06 61/week @ 2024-09-13 26/week @ 2024-09-20 23/week @ 2024-09-27 9/week @ 2024-10-04 13/week @ 2024-10-11 66/week @ 2024-10-18 66/week @ 2024-10-25 37/week @ 2024-11-01

182 downloads per month
Used in 3 crates

MIT/Apache

7KB
52 lines

Syncify

Two functions for the price of one: a simplistic rust macro for writing async functions once and getting both the async version and a sync version that strips all async function modifiers and all .await suffixes.

Status: it works, but this is not intended to be a high-quality, general-purpose crate. The macro error messages are bad, the features are barebones. But it does what we need it to do, and that suffices.

Usage

Place the #[syncify(name_of_sync_mod_variant)] on a mod item. Annotate all use items inside that mod that should be different in the sync version with #[syncify_replace(<alternate-use-item>)].

Example:

use syncify::syncify;
use syncify::syncify_replace;

#[syncify(greet_sync)]
mod greet {
    #[syncify_replace(use crate::speaking_sync::speak;)] // A sync function for speaking.
    use crate::speaking::speak; // An async function for speaking.

    pub async fn do_greet(name: &str) -> usize {
        speak(name).await;
        return name.len();
    }
}

Expands to:

use syncify::syncify;
use syncify::syncify_replace;

mod greet {
    use crate::speaking::speak; // An async function for speaking.

    pub async fn do_greet(name: &str) -> usize {
        speak(name).await;
        return name.len();
    }
}

mod greet_sync {
    use crate::speaking_sync::speak; // A sync function for speaking.

    pub fn do_greet(name: &str) -> usize {
        speak(name);
        return name.len();
    }
}

Dependencies

~265–720KB
~17K SLoC