#lang scheme/base
(require scheme/contract
         scheme/serialize)
(define-serializable-struct check-result (message annotations) #:transparent)
(define-serializable-struct (check-success check-result) () #:transparent)
(define-serializable-struct (check-problem check-result) () #:transparent)
(define-serializable-struct (check-warning check-problem) () #:transparent)
(define-serializable-struct (check-error   check-problem) () #:transparent)
(define-serializable-struct (check-failure check-error) () #:transparent)
(define-serializable-struct (check-fatal check-error) (exn) #:transparent)
(define annotations/c
  (and/c hash? hash-eq?))
(provide annotations/c)
(provide/contract
 [struct check-result                  ([message string?] [annotations annotations/c])]
 [struct (check-success check-result)  ([message string?] [annotations annotations/c])]
 [struct (check-problem check-result)  ([message string?] [annotations annotations/c])]
 [struct (check-warning check-problem) ([message string?] [annotations annotations/c])]
 [struct (check-error   check-problem) ([message string?] [annotations annotations/c])]
 [struct (check-failure check-error)   ([message string?] [annotations annotations/c])]
 [struct (check-fatal   check-error)   ([message string?] [annotations annotations/c] [exn exn?])])