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 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}