package face import "errors" // Sentinel errors for face operations var ( // Client errors ErrNoFacesDetected = errors.New("no faces detected in image") ErrImageTooSmall = errors.New("image too small for face detection") ErrImageTooLarge = errors.New("image exceeds maximum size") ErrInvalidImageFormat = errors.New("invalid image format") ErrImageProcessingFailed = errors.New("failed to process image") // Collection errors ErrCollectionNotFound = errors.New("face collection not found") ErrCollectionExists = errors.New("face collection already exists") ErrCollectionCreationFailed = errors.New("failed to create face collection") // Indexing errors ErrIndexingFailed = errors.New("failed to index face") ErrFaceAlreadyIndexed = errors.New("face already indexed") // Search errors ErrSearchFailed = errors.New("face search failed") ErrNoMatchesFound = errors.New("no matching faces found") // Configuration errors ErrMissingRegion = errors.New("AWS region is required") ErrMissingCollectionID = errors.New("collection ID is required") ErrInvalidMaxFaces = errors.New("max faces must be positive") ErrInvalidThreshold = errors.New("threshold must be between 0 and 100") // Rate limiting errors ErrRateLimitExceeded = errors.New("rate limit exceeded") // AWS service errors ErrAWSServiceError = errors.New("AWS Rekognition service error") ErrAWSAccessDenied = errors.New("AWS access denied") ErrAWSThrottling = errors.New("AWS request throttled") ErrAWSInvalidImage = errors.New("invalid image for AWS Rekognition") ) // FaceSearchError represents a structured error for face search operations type FaceSearchError struct { Code string `json:"code"` Message string `json:"message"` Details string `json:"details,omitempty"` } // Error implements the error interface func (e *FaceSearchError) Error() string { return e.Message } // NewFaceSearchError creates a new FaceSearchError func NewFaceSearchError(code, message, details string) *FaceSearchError { return &FaceSearchError{ Code: code, Message: message, Details: details, } } // Common error codes const ( ErrorCodeNoFaces = "NO_FACES_DETECTED" ErrorCodeInvalidImage = "INVALID_IMAGE" ErrorCodeRateLimited = "RATE_LIMITED" ErrorCodeCollectionError = "COLLECTION_ERROR" ErrorCodeSearchFailed = "SEARCH_FAILED" ErrorCodeIndexingFailed = "INDEXING_FAILED" ErrorCodeInternalError = "INTERNAL_ERROR" ) // User-facing error messages var UserErrorMessages = map[error]string{ ErrNoFacesDetected: "No faces detected in the image. Please upload a photo with clear faces.", ErrImageTooSmall: "Image is too small. Please upload a larger image (minimum 100x100 pixels).", ErrImageTooLarge: "Image is too large. Please upload an image smaller than 10MB.", ErrInvalidImageFormat: "Invalid image format. Please upload a JPEG, PNG, or WebP image.", ErrCollectionNotFound: "Face collection not found. Please contact support.", ErrRateLimitExceeded: "Search limit exceeded. Please try again later.", ErrAWSServiceError: "An error occurred while processing your request. Please try again.", ErrAWSAccessDenied: "Access denied. Please contact support.", ErrAWSThrottling: "Service is busy. Please try again in a few moments.", } // GetUserMessage returns a user-friendly error message func GetUserMessage(err error) string { if msg, ok := UserErrorMessages[err]; ok { return msg } return "An unexpected error occurred. Please try again." }