redis_enterprise/
redis_acls.rs

1//! Redis ACL management
2//!
3//! ## Overview
4//! - Configure Redis ACLs
5//! - Manage user permissions
6//! - Query ACL rules
7
8use crate::client::RestClient;
9use crate::error::Result;
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12use typed_builder::TypedBuilder;
13
14/// Redis ACL information
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct RedisAcl {
17    pub uid: u32,
18    pub name: String,
19    pub acl: String,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub description: Option<String>,
22    /// List of database UIDs this ACL is associated with
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub bdbs: Option<Vec<u32>>,
25
26    #[serde(flatten)]
27    pub extra: Value,
28}
29
30/// Create or update Redis ACL request
31#[derive(Debug, Serialize, Deserialize, TypedBuilder)]
32pub struct CreateRedisAclRequest {
33    #[builder(setter(into))]
34    pub name: String,
35    #[builder(setter(into))]
36    pub acl: String,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    #[builder(default, setter(into, strip_option))]
39    pub description: Option<String>,
40}
41
42/// Redis ACL handler for managing ACLs
43pub struct RedisAclHandler {
44    client: RestClient,
45}
46
47/// Alias for backwards compatibility and intuitive plural naming
48pub type RedisAclsHandler = RedisAclHandler;
49
50impl RedisAclHandler {
51    pub fn new(client: RestClient) -> Self {
52        RedisAclHandler { client }
53    }
54
55    /// List all Redis ACLs
56    pub async fn list(&self) -> Result<Vec<RedisAcl>> {
57        self.client.get("/v1/redis_acls").await
58    }
59
60    /// Get specific Redis ACL
61    pub async fn get(&self, uid: u32) -> Result<RedisAcl> {
62        self.client.get(&format!("/v1/redis_acls/{}", uid)).await
63    }
64
65    /// Create a new Redis ACL
66    pub async fn create(&self, request: CreateRedisAclRequest) -> Result<RedisAcl> {
67        self.client.post("/v1/redis_acls", &request).await
68    }
69
70    /// Update an existing Redis ACL
71    pub async fn update(&self, uid: u32, request: CreateRedisAclRequest) -> Result<RedisAcl> {
72        self.client
73            .put(&format!("/v1/redis_acls/{}", uid), &request)
74            .await
75    }
76
77    /// Delete a Redis ACL
78    pub async fn delete(&self, uid: u32) -> Result<()> {
79        self.client.delete(&format!("/v1/redis_acls/{}", uid)).await
80    }
81
82    /// Validate an ACL payload - POST /v1/redis_acls/validate
83    pub async fn validate(&self, body: CreateRedisAclRequest) -> Result<AclValidation> {
84        self.client.post("/v1/redis_acls/validate", &body).await
85    }
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct AclValidation {
90    pub valid: bool,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub message: Option<String>,
93    #[serde(flatten)]
94    pub extra: Value,
95}