valkey-module-macros-internals 0.1.9

A macros crate for valkeymodule-rs
Documentation
use std::collections::HashMap;

use proc_macro2::TokenStream;
use quote::quote;

lazy_static::lazy_static! {
    pub(crate) static ref API_VERSION_MAPPING: HashMap<String, usize> = HashMap::from([
        ("RedisModule_AddPostNotificationJob".to_string(), 70200),
        ("RedisModule_SetCommandACLCategories".to_string(), 70200),
        ("RedisModule_GetOpenKeyModesAll".to_string(), 70200),
        ("RedisModule_CallReplyPromiseSetUnblockHandler".to_string(), 70200),
        ("RedisModule_CallReplyPromiseAbort".to_string(), 70200),
        ("RedisModule_Microseconds".to_string(), 70200),
        ("RedisModule_CachedMicroseconds".to_string(), 70200),
        ("RedisModule_RegisterAuthCallback".to_string(), 70200),
        ("RedisModule_BlockClientOnKeysWithFlags".to_string(), 70200),
        ("RedisModule_GetModuleOptionsAll".to_string(), 70200),
        ("RedisModule_BlockClientGetPrivateData".to_string(), 70200),
        ("RedisModule_BlockClientSetPrivateData".to_string(), 70200),
        ("RedisModule_BlockClientOnAuth".to_string(), 70200),
        ("RedisModule_ACLAddLogEntryByUserName".to_string(), 70200),
        ("RedisModule_GetCommand".to_string(), 70000),
        ("RedisModule_SetCommandInfo".to_string(), 70000),
        ("RedisModule_AddACLCategory".to_string(), 80000),
    ]);

    pub(crate) static ref API_OLDEST_VERSION: usize = 60000;
    pub(crate) static ref ALL_VERSIONS: Vec<(usize, String)> = vec![
        (60000, "min-redis-compatibility-version-6-0".to_string()),
        (60200, "min-redis-compatibility-version-6-2".to_string()),
        (70000, "min-redis-compatibility-version-7-0".to_string()),
        (70200, "min-redis-compatibility-version-7-2".to_string()),
        (80000, "min-valkey-compatibility-version-8-0".to_string()),
    ];
}

pub(crate) fn get_feature_flags(
    min_required_version: usize,
) -> (Vec<TokenStream>, Vec<TokenStream>) {
    let all_lower_versions: Vec<&str> = ALL_VERSIONS
        .iter()
        .filter_map(|(v, s)| {
            if *v < min_required_version {
                Some(s.as_str())
            } else {
                None
            }
        })
        .collect();
    let all_upper_versions: Vec<&str> = ALL_VERSIONS
        .iter()
        .filter_map(|(v, s)| {
            if *v >= min_required_version {
                Some(s.as_str())
            } else {
                None
            }
        })
        .collect();
    (
        all_lower_versions
            .into_iter()
            .map(|s| quote!(feature = #s).into())
            .collect(),
        all_upper_versions
            .into_iter()
            .map(|s| quote!(feature = #s).into())
            .collect(),
    )
}