feat: initial tools service with document scanner, image & PDF tools
Self-hosted document scanner and media processing tools. - Rust Axum gateway + worker pool with NATS JetStream - Next.js 16 frontend with shadcn/ui - Scanner pipeline: edge detection, warp, binarization, OCR - Image tools: compress, resize, convert - PDF tools: merge, split, compress - CI/CD with Docker multi-stage build Co-Authored-By: Kilo <kilo@kilo.ai>
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
use thiserror::Error;
|
||||
|
||||
/// Errors that can occur during file upload.
|
||||
#[derive(Debug, Error)]
|
||||
pub enum UploadError {
|
||||
#[error("Invalid MIME type: {0}")]
|
||||
InvalidMime(String),
|
||||
|
||||
#[error("File too large: {0} bytes exceeds maximum of {1} bytes")]
|
||||
FileTooLarge(u64, u64),
|
||||
|
||||
#[error("I/O error: {0}")]
|
||||
Io(#[from] std::io::Error),
|
||||
|
||||
#[error("Virus or suspicious content detected")]
|
||||
VirusDetected,
|
||||
|
||||
#[error("Invalid tool: {0}")]
|
||||
InvalidTool(String),
|
||||
|
||||
#[error("Missing file in upload")]
|
||||
MissingFile,
|
||||
|
||||
#[error("Missing tool parameter")]
|
||||
MissingTool,
|
||||
|
||||
#[error("Serialization error: {0}")]
|
||||
Serde(#[from] serde_json::Error),
|
||||
}
|
||||
|
||||
/// Errors during processing pipeline execution.
|
||||
#[derive(Debug, Error)]
|
||||
pub enum PipelineError {
|
||||
#[error("Failed to load image: {0}")]
|
||||
ImageLoad(String),
|
||||
|
||||
#[error("Edge detection failed: {0}")]
|
||||
EdgeDetection(String),
|
||||
|
||||
#[error("Corner detection failed: {0}")]
|
||||
CornerDetection(String),
|
||||
|
||||
#[error("Perspective warp failed: {0}")]
|
||||
Warp(String),
|
||||
|
||||
#[error("Shadow removal failed: {0}")]
|
||||
ShadowRemoval(String),
|
||||
|
||||
#[error("Binarization failed: {0}")]
|
||||
Binarization(String),
|
||||
|
||||
#[error("OCR processing failed: {0}")]
|
||||
Ocr(String),
|
||||
|
||||
#[error("PDF generation failed: {0}")]
|
||||
PdfGeneration(String),
|
||||
|
||||
#[error("Pipeline timed out")]
|
||||
Timeout,
|
||||
|
||||
#[error("Internal error: {0}")]
|
||||
Internal(String),
|
||||
}
|
||||
|
||||
/// Errors related to NATS messaging.
|
||||
#[derive(Debug, Error)]
|
||||
pub enum NatsError {
|
||||
#[error("Failed to publish message: {0}")]
|
||||
Publish(String),
|
||||
|
||||
#[error("Failed to subscribe: {0}")]
|
||||
Subscribe(String),
|
||||
|
||||
#[error("JetStream error: {0}")]
|
||||
JetStream(String),
|
||||
|
||||
#[error("Connection timeout")]
|
||||
Timeout,
|
||||
|
||||
#[error("NATS connection error: {0}")]
|
||||
Connection(String),
|
||||
}
|
||||
|
||||
/// Errors related to Redis operations.
|
||||
#[derive(Debug, Error)]
|
||||
pub enum RedisError {
|
||||
#[error("Redis connection failed: {0}")]
|
||||
Connection(String),
|
||||
|
||||
#[error("Redis query failed: {0}")]
|
||||
Query(String),
|
||||
|
||||
#[error("Serialization error: {0}")]
|
||||
Serialization(#[from] serde_json::Error),
|
||||
|
||||
#[error("Key not found: {0}")]
|
||||
NotFound(String),
|
||||
}
|
||||
|
||||
impl From<redis::RedisError> for RedisError {
|
||||
fn from(e: redis::RedisError) -> Self {
|
||||
RedisError::Query(e.to_string())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user