use paste::paste;
macro_rules! feature_check {
($feature:literal, $name:ident, $doc:expr) => {
paste! {
#[cfg(feature = $feature)]
#[doc = $doc]
pub fn $name() -> bool {
true
}
#[cfg(not(feature = $feature))]
#[doc = $doc]
pub fn $name() -> bool {
false
}
}
};
}
feature_check!("l1-moka", l1_available, "Check if L1 cache is available");
feature_check!("l2-redis", l2_available, "Check if L2 cache is available");
feature_check!(
"metrics",
metrics_available,
"Check if metrics are available"
);
feature_check!(
"bloom-filter",
bloom_available,
"Check if bloom filter is available"
);
feature_check!(
"rate-limiting",
rate_limiting_available,
"Check if rate limiting is available"
);
feature_check!(
"batch-write",
batch_write_available,
"Check if batch write is available"
);
feature_check!(
"wal-recovery",
wal_recovery_available,
"Check if WAL recovery is available"
);
feature_check!(
"serialization",
serialization_available,
"Check if serialization is available"
);
feature_check!(
"compression",
compression_available,
"Check if compression is available"
);
feature_check!(
"database",
database_available,
"Check if database is available"
);
feature_check!("cli", cli_available, "Check if CLI is available");
feature_check!(
"opentelemetry",
opentelemetry_available,
"Check if OpenTelemetry is available"
);
#[derive(Debug, Clone)]
pub struct FeatureSet {
l1_available: bool,
l2_available: bool,
metrics_available: bool,
bloom_available: bool,
rate_limiting_available: bool,
batch_write_available: bool,
wal_recovery_available: bool,
serialization_available: bool,
compression_available: bool,
database_available: bool,
cli_available: bool,
opentelemetry_available: bool,
}
impl FeatureSet {
pub fn current() -> Self {
Self {
l1_available: l1_available(),
l2_available: l2_available(),
metrics_available: metrics_available(),
bloom_available: bloom_available(),
rate_limiting_available: rate_limiting_available(),
batch_write_available: batch_write_available(),
wal_recovery_available: wal_recovery_available(),
serialization_available: serialization_available(),
compression_available: compression_available(),
database_available: database_available(),
cli_available: cli_available(),
opentelemetry_available: opentelemetry_available(),
}
}
pub fn tier_name(&self) -> &'static str {
if self.opentelemetry_available && self.database_available && self.cli_available {
"full"
} else if self.l2_available && self.metrics_available {
"core"
} else if self.l1_available {
"minimal"
} else {
"core"
}
}
pub fn is_l1_available(&self) -> bool {
self.l1_available
}
pub fn is_l2_available(&self) -> bool {
self.l2_available
}
pub fn is_metrics_available(&self) -> bool {
self.metrics_available
}
pub fn is_bloom_available(&self) -> bool {
self.bloom_available
}
pub fn is_rate_limiting_available(&self) -> bool {
self.rate_limiting_available
}
pub fn is_batch_write_available(&self) -> bool {
self.batch_write_available
}
pub fn is_wal_recovery_available(&self) -> bool {
self.wal_recovery_available
}
pub fn is_serialization_available(&self) -> bool {
self.serialization_available
}
pub fn is_compression_available(&self) -> bool {
self.compression_available
}
pub fn is_database_available(&self) -> bool {
self.database_available
}
pub fn is_cli_available(&self) -> bool {
self.cli_available
}
pub fn is_opentelemetry_available(&self) -> bool {
self.opentelemetry_available
}
}
impl Default for FeatureSet {
fn default() -> Self {
Self::current()
}
}