use async_trait::async_trait;
use crate::error::Result;
use super::types::DeploymentState;
use super::lock::LockInfo;
#[async_trait]
pub trait StateStore: Send + Sync {
async fn load(&self) -> Result<Option<DeploymentState>>;
async fn save(&self, state: &DeploymentState) -> Result<()>;
async fn delete(&self) -> Result<()>;
async fn exists(&self) -> Result<bool>;
async fn acquire_lock(&self, holder: &str) -> Result<LockInfo>;
async fn release_lock(&self, lock_id: &str) -> Result<()>;
async fn get_lock_info(&self) -> Result<Option<LockInfo>>;
async fn is_locked(&self) -> Result<bool>;
fn backend_type(&self) -> &'static str;
}
#[async_trait]
impl StateStore for Box<dyn StateStore> {
async fn load(&self) -> Result<Option<DeploymentState>> {
(**self).load().await
}
async fn save(&self, state: &DeploymentState) -> Result<()> {
(**self).save(state).await
}
async fn delete(&self) -> Result<()> {
(**self).delete().await
}
async fn exists(&self) -> Result<bool> {
(**self).exists().await
}
async fn acquire_lock(&self, holder: &str) -> Result<LockInfo> {
(**self).acquire_lock(holder).await
}
async fn release_lock(&self, lock_id: &str) -> Result<()> {
(**self).release_lock(lock_id).await
}
async fn get_lock_info(&self) -> Result<Option<LockInfo>> {
(**self).get_lock_info().await
}
async fn is_locked(&self) -> Result<bool> {
(**self).is_locked().await
}
fn backend_type(&self) -> &'static str {
(**self).backend_type()
}
}