cache_kit/
lib.rs

1//! # cache-kit
2//!
3//! A type-safe, fully generic, production-ready caching framework for Rust.
4//!
5//! ## Features
6//!
7//! - **Fully Generic:** Cache any type `T` that implements `CacheEntity`
8//! - **Backend Agnostic:** Support for in-memory, Redis, Memcached, and custom backends
9//! - **Database Agnostic:** Works with SQLx, tokio-postgres, Diesel, or custom repositories
10//! - **Framework Independent:** Zero dependencies on web frameworks (Axum, Actix, Rocket, etc.)
11//! - **Production Ready:** Built-in logging, metrics support, and error handling
12//! - **Type Safe:** Compile-time verified, no magic strings
13//!
14//! ## Quick Start
15//!
16//! ### For Web Applications (Recommended)
17//!
18//! Use [`CacheService`] for easy sharing across threads:
19//!
20//! ```ignore
21//! use cache_kit::{
22//!     CacheService, CacheEntity, CacheFeed, DataRepository,
23//!     backend::InMemoryBackend,
24//!     strategy::CacheStrategy,
25//! };
26//! use serde::{Deserialize, Serialize};
27//!
28//! // 1. Define your entity
29//! #[derive(Clone, Serialize, Deserialize)]
30//! struct User {
31//!     id: String,
32//!     name: String,
33//! }
34//!
35//! // 2. Implement CacheEntity
36//! impl CacheEntity for User {
37//!     type Key = String;
38//!     fn cache_key(&self) -> Self::Key { self.id.clone() }
39//!     fn cache_prefix() -> &'static str { "user" }
40//! }
41//!
42//! // 3. Create feeder
43//! struct UserFeeder {
44//!     id: String,
45//!     user: Option<User>,
46//! }
47//!
48//! impl CacheFeed<User> for UserFeeder {
49//!     fn entity_id(&mut self) -> String { self.id.clone() }
50//!     fn feed(&mut self, entity: Option<User>) { self.user = entity; }
51//! }
52//!
53//! // 4. Create cache (wrap backend in Arc automatically)
54//! let cache = CacheService::new(InMemoryBackend::new());
55//!
56//! // 5. Use it - CacheService is Clone for thread sharing
57//! let cache_clone = cache.clone();  // Cheap - just Arc increment
58//! let mut feeder = UserFeeder { id: "user_1".to_string(), user: None };
59//! cache.execute(&mut feeder, &repository, CacheStrategy::Refresh).await?;
60//! ```
61//!
62//! ### For Custom Patterns (Advanced)
63//!
64//! Use [`CacheExpander`] for explicit control:
65//!
66//! ```ignore
67//! use cache_kit::{CacheExpander, backend::InMemoryBackend};
68//! use std::sync::Arc;
69//!
70//! // Lower-level API - wrap in Arc yourself if needed
71//! let expander = CacheExpander::new(InMemoryBackend::new());
72//! let cache = Arc::new(expander);  // Manual Arc wrapping
73//! let cache_clone = cache.clone();
74//! ```
75
76#[macro_use]
77extern crate log;
78
79pub mod backend;
80pub mod entity;
81pub mod error;
82pub mod expander;
83pub mod feed;
84pub mod key;
85pub mod observability;
86pub mod repository;
87pub mod serialization;
88pub mod service;
89pub mod strategy;
90
91// Re-exports for convenience
92pub use backend::CacheBackend;
93pub use entity::CacheEntity;
94pub use error::{Error, Result};
95pub use expander::{CacheExpander, OperationConfig};
96pub use feed::CacheFeed;
97pub use repository::DataRepository;
98pub use service::CacheService;
99pub use strategy::CacheStrategy;
100
101/// Library version
102pub const VERSION: &str = env!("CARGO_PKG_VERSION");