File size: 1,451 Bytes
43203b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(in-package :forms)

(defclass boolean-form-field (form-field)
  ()
  (:documentation "A boolean input"))

(defmethod field-required-p ((form-field boolean-form-field))
  nil)

(defmethod validate-form-field ((form-field boolean-form-field))
  (multiple-value-bind (valid-p error)
      (funcall (clavier:is-a-boolean (or (field-invalid-message form-field)
                                         "~A should be a boolean")
                                     (or (field-label form-field)
                                         (field-name form-field)))
               (field-value form-field))
    (multiple-value-bind (valid-constraints-p errors)
        (call-next-method)
      (values (and valid-p valid-constraints-p)
              (if error (cons error errors)
                  errors)))))

(defmethod field-read-from-request ((field boolean-form-field) form parameters)
  (setf (field-value field)
        (equalp
         (cdr (assoc (field-request-name field form) parameters :test #'string=))
         "on")))

(defmethod format-field-value ((field boolean-form-field) value &optional (stream *standard-output*))
  (if value
      (write-string "on" stream)
      (write-string "off" stream)))

(defmethod make-form-field ((field-type (eql 'boolean)) &rest args)
  (apply #'make-instance 'boolean-form-field args))

(defmethod make-form-field ((field-type (eql :boolean)) &rest args)
  (apply #'make-instance 'boolean-form-field args))