oxcache 0.4.2

A high-performance multi-level cache library for Rust with L1 (memory) and L2 (Redis) caching.
Documentation
[package]
name = "oxcache"
version.workspace = true
edition.workspace = true
rust-version = "1.85"
description = "A high-performance multi-level cache library for Rust with L1 (memory) and L2 (Redis) caching."
authors.workspace = true
license.workspace = true
repository.workspace = true
readme = "README.md"
keywords = ["cache", "redis", "memory", "async", "performance"]
categories = ["caching", "asynchronous", "database"]

[lib]
name = "oxcache"
path = "src/lib.rs"

# ============================================================================
# WORKSPACE
# ============================================================================
[workspace]
resolver = "2"
members = [".", "macros", "examples"]

[workspace.package]
version = "0.4.2"
edition = "2024"
authors = ["Kirky.X"]
license = "MIT"
repository = "https://github.com/Kirky-X/oxcache"

[workspace.dependencies]
tokio = { version = "1.53", default-features = false }
async-trait = "0.1"
tracing = { version = "0.1", default-features = false }
tracing-subscriber = { version = "0.3", default-features = false }
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0" }
chrono = { version = "0.4", default-features = false }
criterion = { version = "0.8", features = ["async_tokio"] }

# ============================================================================
# DEPENDENCIES
# ============================================================================
[dependencies]
# Internal macros
oxcache_macros = { path = "macros", version = "0.4", optional = true }

# Async Runtime
tokio = { version = "1.53", default-features = false, features = [
    "rt",
    "rt-multi-thread",
    "sync",
    "time",
    "macros",
    "bytes",
] }
async-trait = "0.1"
once_cell = "1.21"

# Utilities
uuid = { version = "1.24", features = ["v4"] }

# Error Handling
[dependencies.anyhow]
version = "1.0"
optional = true

# trait-kit integration (optional, feature-gated via `kit`)
[dependencies.trait-kit]
version = "0.4"
features = ["async", "lifecycle", "health"]
optional = true
default-features = false

# futures executor for sync health check in async context (kit feature only)
[dependencies.futures]
version = "0.3"
optional = true
default-features = false
features = ["executor"]

# ICU4X internationalization (always enabled)
[dependencies.icu]
version = "2.2"

[dependencies.writeable]
version = "0.6"

# L1 Cache (Memory)
[dependencies.moka]
version = "0.12"
default-features = false
features = ["future"]
optional = true

[dependencies.dashmap]
version = "6.2"
optional = true

# L2 Cache (Redis)
[dependencies.redis]
version = "1.5"
default-features = false
features = ["aio", "tokio-comp", "connection-manager", "cluster-async", "sentinel"]
optional = true

# Aerospike (independent protocol, feature-gated)
[dependencies.aerospike]
version = "2.1"
optional = true

# Serialization & Compression
[dependencies.serde]
version = "1.0"
features = ["derive"]
optional = true

[dependencies.serde_json]
version = "1.0"
features = ["unbounded_depth"]
optional = true

[dependencies.flate2]
version = "1.1"
optional = true

[dependencies.serde_stacker]
version = "0.1"
optional = true

# Observability & Metrics
[dependencies.bloomfilter]
version = "3.0"
optional = true

[dependencies.regex]
version = "1.13"
optional = true

[dependencies.chrono]
version = "0.4"
default-features = false
features = ["serde", "clock"]
optional = true

# ============================================================================
# DEV DEPENDENCIES
# ============================================================================
[dev-dependencies]
tempfile = "3.27"
serial_test = "4.0"
rand = "0.10"
criterion = { version = "0.8", features = ["async_tokio"] }
ctor = "1.0"
trybuild = "1.0"
tracing-subscriber = { version = "0.3", default-features = false, features = ["env-filter", "fmt"] }

[dev-dependencies.testcontainers]
version = "0.27"

[dev-dependencies.testcontainers-modules]
version = "0.15"
features = ["redis"]

# ============================================================================
# FEATURES
# ============================================================================
[features]
# Default: Minimal (L1 memory cache only)
default = ["minimal"]

# Tiered presets
minimal = [
    "memory",
    "tokio/time",
    "metrics",
    "serialization",
    "dep:chrono",
]
core = ["minimal", "redis"]
full = [
    "core",
    "macros",
    "compression",
    "batch-write",
    "lua-script",
    "cli",
    "testing",
    "dragonfly",
    "aerospike",
]

# Component features
memory = ["dep:moka", "dep:dashmap", "dep:serde"]
redis = ["dep:redis", "dep:regex"]
dragonfly = ["redis"]
aerospike = ["dep:aerospike"]
macros = ["dep:oxcache_macros", "minimal"]
serialization = ["dep:serde", "dep:serde_json", "dep:serde_stacker"]
flate2 = ["dep:flate2"]
compression = ["dep:flate2", "flate2"]
tracing = []
metrics = ["serialization", "dep:chrono", "dep:dashmap"]
batch-write = []
lua-script = ["redis"]
cli = ["dep:dashmap", "metrics"]
testing = []
bloom-filter = ["dep:bloomfilter"]
kit = ["dep:trait-kit", "dep:futures"]

# ============================================================================
# PROFILES
# ============================================================================
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"
strip = true
overflow-checks = false

[profile.release.package."*"]
opt-level = 3

[profile.release-with-debug]
inherits = "release"
debug = true
strip = false

[profile.dev]
opt-level = 0
debug = true
incremental = true

[profile.dev-optimized]
inherits = "dev"
opt-level = 2
debug = true

[profile.test]
opt-level = 0
debug = true

[profile.bench]
inherits = "release"

[profile.dev.package.moka]
opt-level = 2

[profile.dev.package.redis]
opt-level = 2

[profile.dev.package.serde]
opt-level = 2

[profile.dev.package.serde_json]
opt-level = 2

[profile.dev.package.tokio]
opt-level = 2

# ============================================================================
# BENCHMARKS
# ============================================================================
[[bench]]
name = "modern_api_benchmark"
harness = false

[[bench]]
name = "redis_benchmark"
harness = false
required-features = ["redis"]

[[bench]]
name = "serialization_benchmark"
harness = false
required-features = ["serialization"]

[[bench]]
name = "dashmap_benchmark"
harness = false
required-features = ["memory"]

[[bench]]
name = "dragonfly_benchmark"
harness = false
required-features = ["dragonfly"]

[lints.rust]
unexpected_cfgs = "allow"