use thiserror::Error;
#[derive(Debug, Error)]
pub enum RegistryError {
#[error("Package already exists: {package_name} v{version}")]
PackageExists {
package_name: String,
version: String,
},
#[error("Package not found: {package_name} v{version}")]
PackageNotFound {
package_name: String,
version: String,
},
#[error("Package is in use: {package_name} v{version} has {active_count} active executions")]
PackageInUse {
package_name: String,
version: String,
active_count: usize,
},
#[error("Package validation failed: {reason}")]
ValidationError {
reason: String,
},
#[error("Failed to extract metadata from package: {reason}")]
MetadataExtractionError {
reason: String,
},
#[error("Failed to register tasks: {reason}")]
TaskRegistrationError {
reason: String,
},
#[error("Registration failed: {message}")]
RegistrationFailed {
message: String,
},
#[error("Storage error: {0}")]
Storage(#[from] StorageError),
#[error("Database error: {0}")]
Database(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("Invalid UUID: {0}")]
InvalidUuid(#[from] uuid::Error),
#[error("Package loader error: {0}")]
Loader(#[from] LoaderError),
#[error("Internal error: {0}")]
Internal(String),
}
#[derive(Debug, Error)]
pub enum StorageError {
#[error("Storage connection failed: {reason}")]
ConnectionFailed {
reason: String,
},
#[error("Storage operation timed out after {seconds} seconds")]
Timeout {
seconds: u64,
},
#[error("Storage quota exceeded: {used_bytes} / {quota_bytes} bytes used")]
QuotaExceeded {
used_bytes: u64,
quota_bytes: u64,
},
#[error("Data corruption detected for ID {id}: {reason}")]
DataCorruption {
id: String,
reason: String,
},
#[error("Invalid storage ID: {id}")]
InvalidId {
id: String,
},
#[error("Storage backend error: {0}")]
Backend(String),
#[error("Database error: {0}")]
Database(#[from] diesel::result::Error),
}
impl From<String> for RegistryError {
fn from(s: String) -> Self {
RegistryError::Internal(s)
}
}
impl From<String> for StorageError {
fn from(s: String) -> Self {
StorageError::Backend(s)
}
}
#[derive(Debug, Error)]
pub enum LoaderError {
#[error("Temporary directory error: {error}")]
TempDirectory {
error: String,
},
#[error("Failed to load library at {path}: {error}")]
LibraryLoad {
path: String,
error: String,
},
#[error("Symbol '{symbol}' not found: {error}")]
SymbolNotFound {
symbol: String,
error: String,
},
#[error("Metadata extraction failed: {reason}")]
MetadataExtraction {
reason: String,
},
#[error("File system error at {path}: {error}")]
FileSystem {
path: String,
error: String,
},
#[error("Package validation failed: {reason}")]
Validation {
reason: String,
},
#[error("Task registration failed: {reason}")]
TaskRegistration {
reason: String,
},
#[error("Wrong package language: expected {expected}, got {actual}")]
WrongLanguage {
expected: String,
actual: String,
},
#[error("Missing python configuration in manifest")]
MissingPythonConfig,
#[error("Missing manifest.json in package archive")]
MissingManifest,
#[error("Failed to parse manifest: {reason}")]
ManifestParse {
reason: String,
},
#[error("Missing workflow source directory in Python package")]
MissingSourceDir,
}