use async_trait::async_trait;
use reduct_base::error::ReductError;
use reduct_base::msg::lifecycle_api::{LifecycleSettings, LifecycleType};
use std::sync::Arc;
mod compress;
mod delete;
mod progress;
use compress::CompressLifecycleAction;
use delete::DeleteLifecycleAction;
use crate::storage::engine::StorageEngine;
#[derive(Clone)]
pub(super) struct LifecycleContext {
pub(super) storage: Arc<StorageEngine>,
pub(super) system_events_enabled: bool,
pub(super) system_event_instance: String,
}
impl LifecycleContext {
pub(super) fn new(
storage: Arc<StorageEngine>,
system_events_enabled: bool,
system_event_instance: String,
) -> Self {
Self {
storage,
system_events_enabled,
system_event_instance,
}
}
}
#[derive(Clone, Debug, Default)]
pub(super) struct LifecycleRunResult {
pub(super) affected_records: u64,
pub(super) affected_blocks: Option<u64>,
pub(super) last_processed_ts: Option<u64>,
pub(super) caught_up: bool,
}
#[async_trait]
pub(super) trait LifecycleAction {
fn lifecycle_type(&self) -> LifecycleType;
async fn run(
&self,
name: &str,
settings: &LifecycleSettings,
context: LifecycleContext,
) -> Result<LifecycleRunResult, ReductError>;
}
pub(super) fn build_lifecycle_action(
lifecycle_type: LifecycleType,
) -> Arc<dyn LifecycleAction + Send + Sync> {
match lifecycle_type {
LifecycleType::Delete => Arc::new(DeleteLifecycleAction),
LifecycleType::Compress => Arc::new(CompressLifecycleAction),
}
}