-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschedule.go
88 lines (76 loc) · 1.57 KB
/
schedule.go
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package filterschedule
import (
"encoding/json"
"errors"
"time"
)
type DayOfTheWeek time.Weekday
var daysOfWeek = map[string]DayOfTheWeek{}
func init() {
for d := time.Sunday; d <= time.Saturday; d++ {
name := d.String()
daysOfWeek[name] = DayOfTheWeek(d)
}
}
func (i *DayOfTheWeek) UnmarshalJSON(b []byte) error {
var s string
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
if d, ok := daysOfWeek[s]; ok {
*i = d
return nil
}
return errors.New("invalid week day name: " + s)
}
type Schedule struct {
Always bool
Schedule []ScheduleEntry
}
type ScheduleEntry struct {
Days []DayOfTheWeek
Hours []TimeInteval
}
type TimeInteval struct {
From string
To string
}
func (ti *TimeInteval) includes(t time.Time) bool {
date := t.Format("2006-01-02")
from, err := time.ParseInLocation("2006-01-02T15:04", date+"T"+ti.From, t.Location())
if err != nil {
log.Error(err)
}
to, err := time.ParseInLocation("2006-01-02T15:04", date+"T"+ti.To, t.Location())
if err != nil {
log.Error(err)
}
return from.Before(t) && t.Before(to)
}
func isApplicableAtDays(days []DayOfTheWeek, t time.Time) bool {
if len(days) == 0 {
return true
} else {
for _, d := range days {
if DayOfTheWeek(t.Weekday()) == d {
log.Debug("Matched: ", days)
return true
}
}
}
return false
}
func isApplicableAtHours(timeIntervals []TimeInteval, t time.Time) bool {
if len(timeIntervals) == 0 {
return true
} else {
for _, ti := range timeIntervals {
if ti.includes(t) {
log.Debug("Matched: ", timeIntervals)
return true
}
}
}
return false
}