;;;; conditions.lisp -- MCIAS error condition hierarchy (in-package #:mcias-client) (define-condition mcias-error (error) ((status :initarg :status :reader mcias-error-status :documentation "HTTP status code (integer).") (message :initarg :message :reader mcias-error-message :documentation "Server error message string.")) (:report (lambda (c s) (format s "MCIAS error ~A: ~A" (mcias-error-status c) (mcias-error-message c)))) (:documentation "Base condition for all MCIAS API errors.")) (define-condition mcias-auth-error (mcias-error) () (:documentation "401 Unauthorized -- token missing, invalid, or expired.")) (define-condition mcias-forbidden-error (mcias-error) () (:documentation "403 Forbidden -- insufficient role.")) (define-condition mcias-not-found-error (mcias-error) () (:documentation "404 Not Found -- resource does not exist.")) (define-condition mcias-input-error (mcias-error) () (:documentation "400 Bad Request -- malformed request.")) (define-condition mcias-conflict-error (mcias-error) () (:documentation "409 Conflict -- e.g. duplicate username.")) (define-condition mcias-server-error (mcias-error) () (:documentation "5xx -- unexpected server error.")) (defun signal-mcias-error (status message) "Signal the appropriate MCIAS condition for STATUS (integer) and MESSAGE (string)." (case status (401 (error 'mcias-auth-error :status status :message message)) (403 (error 'mcias-forbidden-error :status status :message message)) (404 (error 'mcias-not-found-error :status status :message message)) (400 (error 'mcias-input-error :status status :message message)) (409 (error 'mcias-conflict-error :status status :message message)) (t (error 'mcias-server-error :status status :message message))))