use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{Duration, SystemTime};
use uuid::Uuid;
use crate::Vector;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentItem {
pub id: String,
pub content_type: String,
pub content: String,
pub metadata: HashMap<String, String>,
pub priority: ProcessingPriority,
pub created_at: SystemTime,
pub expires_at: Option<SystemTime>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum ProcessingPriority {
Low,
Normal,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ProcessingStatus {
Pending,
Processing,
Completed,
Failed { reason: String },
Retried { attempt: usize },
}
#[derive(Debug, Clone)]
pub struct ProcessingResult {
pub item: ContentItem,
pub vector: Option<Vector>,
pub status: ProcessingStatus,
pub duration: Duration,
pub error: Option<String>,
pub metadata: HashMap<String, String>,
}
pub trait EmbeddingGenerator: Send + Sync {
fn generate_embedding(&self, content: &ContentItem) -> Result<Vector>;
fn generate_batch_embeddings(&self, content: &[ContentItem]) -> Result<Vec<ProcessingResult>>;
fn embedding_dimensions(&self) -> usize;
fn get_config(&self) -> serde_json::Value;
fn is_ready(&self) -> bool;
fn get_statistics(&self) -> GeneratorStatistics;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeneratorStatistics {
pub total_embeddings: u64,
pub total_processing_time: Duration,
pub average_processing_time: Duration,
pub error_count: u64,
pub last_error: Option<String>,
}
pub trait IncrementalVectorIndex: Send + Sync {
fn upsert_vector(&mut self, id: String, vector: Vector) -> Result<()>;
fn remove_vector(&mut self, id: &str) -> Result<bool>;
fn batch_upsert(&mut self, vectors: Vec<(String, Vector)>) -> Result<Vec<Result<()>>>;
fn get_statistics(&self) -> IndexStatistics;
fn optimize(&mut self) -> Result<()>;
fn health_check(&self) -> Result<HealthStatus>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexStatistics {
pub total_vectors: usize,
pub memory_usage: u64,
pub last_optimization: Option<SystemTime>,
pub total_operations: u64,
pub error_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum HealthStatus {
Healthy,
Warning { message: String },
Unhealthy { message: String },
Unknown,
}
pub trait AlertHandler: Send + Sync {
fn handle_alert(&self, alert: &Alert) -> Result<()>;
fn get_config(&self) -> AlertConfig;
fn is_enabled(&self) -> bool;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Alert {
pub id: Uuid,
pub severity: AlertSeverity,
pub category: AlertCategory,
pub message: String,
pub details: HashMap<String, String>,
pub timestamp: SystemTime,
pub source: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum AlertSeverity {
Info,
Warning,
Error,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum AlertCategory {
Performance,
Quality,
Health,
Security,
Configuration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertConfig {
pub min_severity: AlertSeverity,
pub throttling: AlertThrottling,
pub enable_notifications: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertThrottling {
pub enabled: bool,
pub window_duration: Duration,
pub max_alerts_per_window: usize,
}
pub trait MetricsStorage: Send + Sync {
fn store_metric(
&mut self,
name: &str,
value: f64,
timestamp: SystemTime,
tags: HashMap<String, String>,
) -> Result<()>;
fn get_metrics(
&self,
name: &str,
start: SystemTime,
end: SystemTime,
) -> Result<Vec<MetricPoint>>;
fn get_metric_names(&self) -> Result<Vec<String>>;
fn cleanup_old_metrics(&mut self, cutoff: SystemTime) -> Result<usize>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricPoint {
pub value: f64,
pub timestamp: SystemTime,
pub tags: HashMap<String, String>,
}
pub trait VersionStorage: Send + Sync {
fn store_version(&mut self, id: &str, version: &Version) -> Result<()>;
fn get_version(&self, id: &str, version_number: u64) -> Result<Option<Version>>;
fn get_all_versions(&self, id: &str) -> Result<Vec<Version>>;
fn cleanup_old_versions(&mut self, id: &str, keep_count: usize) -> Result<usize>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Version {
pub version: u64,
pub vector: Vector,
pub created_at: SystemTime,
pub metadata: HashMap<String, String>,
pub checksum: String,
}
pub trait ConflictResolutionFunction: Send + Sync {
fn resolve_conflict(&self, versions: &[Version]) -> Result<Vector>;
fn get_strategy_name(&self) -> &str;
}
pub trait TransactionLog: Send + Sync {
fn log_transaction(&mut self, transaction: &Transaction) -> Result<()>;
fn get_transactions(&self, start: SystemTime, end: SystemTime) -> Result<Vec<Transaction>>;
fn replay_from(&self, checkpoint: SystemTime) -> Result<Vec<Transaction>>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transaction {
pub id: Uuid,
pub transaction_type: TransactionType,
pub resource_id: String,
pub timestamp: SystemTime,
pub data: serde_json::Value,
pub status: TransactionStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum TransactionType {
Insert,
Update,
Delete,
Batch,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum TransactionStatus {
Pending,
Committed,
RolledBack,
Failed { reason: String },
}
pub trait InconsistencyDetectionAlgorithm: Send + Sync {
fn detect_inconsistencies(&self) -> Result<Vec<Inconsistency>>;
fn get_algorithm_name(&self) -> &str;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Inconsistency {
pub inconsistency_type: InconsistencyType,
pub affected_resources: Vec<String>,
pub description: String,
pub severity: InconsistencySeverity,
pub detected_at: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum InconsistencyType {
DataMismatch,
MissingData,
DuplicateData,
StaleData,
CorruptedData,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum InconsistencySeverity {
Low,
Medium,
High,
Critical,
}
pub trait ConsistencyRepairStrategy: Send + Sync {
fn repair_inconsistencies(
&self,
inconsistencies: &[Inconsistency],
) -> Result<Vec<RepairResult>>;
fn get_strategy_name(&self) -> &str;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RepairResult {
pub inconsistency: Inconsistency,
pub status: RepairStatus,
pub actions: Vec<String>,
pub repaired_at: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum RepairStatus {
Success,
PartialSuccess,
Failed { reason: String },
Skipped { reason: String },
}