Skip to main content

secrets_core/
engine.rs

1use async_trait::async_trait;
2use thiserror::Error;
3
4use crate::lease::Lease;
5use crate::storage::StorageBackend;
6
7#[derive(Debug, Error)]
8pub enum EngineError {
9    #[error("not found")]
10    NotFound,
11    #[error("operation not supported by this engine")]
12    Unsupported,
13    #[error("invalid request: {0}")]
14    InvalidRequest(String),
15    #[error("storage error: {0}")]
16    Storage(#[from] crate::storage::StorageError),
17    #[error("engine error: {0}")]
18    Other(String),
19}
20
21pub type EngineResult<T> = Result<T, EngineError>;
22
23#[async_trait]
24pub trait SecretsEngine: Send + Sync {
25    async fn read(&self, storage: &dyn StorageBackend, path: &str) -> EngineResult<serde_json::Value>;
26    async fn write(
27        &self,
28        storage: &dyn StorageBackend,
29        path: &str,
30        data: serde_json::Value,
31    ) -> EngineResult<()>;
32    async fn delete(&self, storage: &dyn StorageBackend, path: &str) -> EngineResult<()>;
33    async fn list(&self, storage: &dyn StorageBackend, prefix: &str) -> EngineResult<Vec<String>>;
34
35    /// Dynamic-secret engines (e.g. Postgres) override these; static
36    /// engines (e.g. KV) inherit the default `Unsupported`.
37    async fn generate(
38        &self,
39        _storage: &dyn StorageBackend,
40        _role: &str,
41    ) -> EngineResult<(serde_json::Value, Lease)> {
42        Err(EngineError::Unsupported)
43    }
44
45    async fn revoke(&self, _storage: &dyn StorageBackend, _lease: &Lease) -> EngineResult<()> {
46        Err(EngineError::Unsupported)
47    }
48}