kegani 0.1.1

A developer-friendly, ergonomic, production-ready Rust web framework
Documentation
//! Cache key builder for Kegani
//!
//! Provides utilities for building consistent cache keys.

/// Key builder for cache keys
pub struct KeyBuilder {
    prefix: String,
    parts: Vec<String>,
}

impl KeyBuilder {
    /// Create a new key builder with prefix
    pub fn new(prefix: &str) -> Self {
        Self {
            prefix: prefix.to_string(),
            parts: Vec::new(),
        }
    }

    /// Add a part to the key
    pub fn push(mut self, part: &str) -> Self {
        self.parts.push(part.to_string());
        self
    }

    /// Add an ID parameter
    pub fn id(self, name: &str, id: &str) -> Self {
        self.push(&format!("{}:{}", name, id))
    }

    /// Add a pagination parameter
    pub fn page(self, page: u32, size: u32) -> Self {
        self.push(&format!("p{}_s{}", page, size))
    }

    /// Build the final key
    pub fn build(&self) -> String {
        if self.parts.is_empty() {
            self.prefix.clone()
        } else {
            format!("{}:{}", self.prefix, self.parts.join(":"))
        }
    }

    /// Build with pattern (for deletion)
    pub fn build_pattern(&self) -> String {
        if self.parts.is_empty() {
            format!("{}*", self.prefix)
        } else {
            format!("{}:{}*", self.prefix, self.parts.join(":"))
        }
    }
}

impl Default for KeyBuilder {
    fn default() -> Self {
        Self::new("kegani")
    }
}

/// Common cache key patterns
pub mod patterns {
    use super::KeyBuilder;

    /// User cache keys
    pub fn user(id: &str) -> String {
        KeyBuilder::new("user").id("id", id).build()
    }

    /// User list cache key
    pub fn user_list(page: u32, size: u32) -> String {
        KeyBuilder::new("user").page(page, size).build()
    }

    /// Product cache keys
    pub fn product(id: &str) -> String {
        KeyBuilder::new("product").id("id", id).build()
    }

    /// Session cache key
    pub fn session(user_id: &str) -> String {
        KeyBuilder::new("session").id("uid", user_id).build()
    }

    /// Token cache key (for revocation)
    pub fn token(jti: &str) -> String {
        KeyBuilder::new("token").id("jti", jti).build()
    }

    /// Rate limit key
    pub fn rate_limit(ip: &str) -> String {
        KeyBuilder::new("ratelimit").id("ip", ip).build()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_key_builder() {
        let key = KeyBuilder::new("user")
            .id("id", "123")
            .build();
        assert_eq!(key, "user:id:123");

        let key = KeyBuilder::new("user")
            .page(1, 20)
            .build();
        assert_eq!(key, "user:p1_s20");
    }

    #[test]
    fn test_patterns() {
        assert_eq!(patterns::user("abc"), "user:id:abc");
        assert_eq!(patterns::session("user1"), "session:uid:user1");
    }
}