use proc_macro2::TokenStream;
use quote::quote;
pub(crate) fn redis() -> TokenStream {
attribute(
"redis",
cfg!(feature = "runtime-feature-gates"),
cfg!(feature = "redis"),
)
}
fn attribute(feature: &str, runtime_gates: bool, enabled: bool) -> TokenStream {
match (runtime_gates, enabled) {
(false, _) => quote! { #[cfg(feature = #feature)] },
(true, true) => TokenStream::new(),
(true, false) => quote! { #[cfg(any())] },
}
}
#[cfg(test)]
mod tests {
use super::attribute;
#[test]
fn runtime_gates_never_emit_an_application_feature_check() {
assert_eq!(
attribute("redis", false, true).to_string(),
"# [cfg (feature = \"redis\")]"
);
assert!(attribute("redis", true, true).is_empty());
assert_eq!(
attribute("redis", true, false).to_string(),
"# [cfg (any ())]"
);
}
#[test]
fn generated_models_follow_the_runtime_redis_feature() {
let input: syn::DeriveInput = syn::parse_quote! {
#[orm(table = "docs")]
struct Doc {
id: i32,
body: String,
}
};
let parsed = crate::parser::parse(&input).expect("test model should parse");
let rels = crate::relationships::generate(&parsed);
let generated = format!(
"{} {}",
crate::builder::generate(
&parsed,
&rels.flags,
&rels.inits,
&rels.methods,
&rels.eager_loads
),
crate::models::generate(&parsed, &rels.model_methods)
);
assert!(generated.contains("fn remember"));
assert!(generated.contains("fn save_to_redis"));
let application_cfg = generated.contains("cfg (feature = \"redis\")");
assert_eq!(
application_cfg,
!cfg!(feature = "runtime-feature-gates"),
"{generated}"
);
}
}