aboutsummaryrefslogtreecommitdiff
path: root/module/vcomponent/recurrence/internal.scm
blob: cb00cd3d0663e095cc86bb092f1365d9ca2db644 (plain)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(define-module (vcomponent recurrence internal)
  #:export (repeating? format-recur-rule make-recur-rule)

  #:use-module (srfi srfi-88)           ; better keywords
  #:use-module ((vcomponent base) :select (attr))
  #:use-module (datetime util)
  #:use-module (util)
  )

;; EXDATE is also a property linked to recurense rules
;; but that property alone don't create a recuring event.
(define (repeating? ev)
  "Does this event repeat?"
  (or (attr ev 'RRULE)
      (attr ev 'RDATE)))

;; Immutable, since I easily want to be able to generate the recurence set for
;; the same event multiple times.
(define-quick-record recur-rule
  (public: freq until count interval bysecond byminute byhour
           byday bymonthday byyearday byweekno bymonth bysetpos
           wkst)

  ;; TODO make this part of define-quick-record.
  ;; Only "hard" part would be to provide type hints for fields for
  ;; string conversions.
  (printer:
   (lambda (r port)
     (define (get f)
       ((record-accessor <recur-rule> f) r))
     (with-output-to-string
       (lambda ()
         (display "#<<recur-rule>" port)
         (for field in (record-type-fields <recur-rule>)
              (awhen (get field)
                     (display " " port)
                     (display field port)
                     (display "=" port)
                     (display
                      (case field
                        ;; TODO check over date/time/datetime here
                        ;; ((until) ((@ (datetime util) time->string) it))
                        (else it))
                      port)))
         (display ">" port))))))

;; @begin{example}
;; (mkrule (freq HOURLY) (wkst MO) (interval 1))
;; @end
;; TODO field validation here, like in parse-recurrence-rule.
;; NOTE this shadows built in constructor generated in define-quick-record
(define-syntax make-recur-rule
  (syntax-rules ()
    ((_ (key val) ...)
     ((record-constructor <recur-rule> (quote (key ...)))
      val ...))))

(define-public weekdays
  (weekday-list sun))

(define-public intervals
  '(SECONDLY MINUTELY HOURLY DAILY WEEKLY MONTHLY YEARLY))