-
Notifications
You must be signed in to change notification settings - Fork 0
/
trigger.go
63 lines (52 loc) · 1.49 KB
/
trigger.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
package main
import "time"
var past = time.Now().Add(-100 * time.Minute)
// Trigger is an interface for anything that define when a job to be executed
type Trigger interface {
// NextFire should return the time when it will fire next. If it no longer fires, it should return a past time
NextFire() time.Time
}
// NeverTrigger is the nil triggers that never triggers
type NeverTrigger struct {
}
// NextFire always returns a past value
func (trigger NeverTrigger) NextFire() time.Time {
return past
}
// OneTimeTrigger is a trigger that fires only once
type OneTimeTrigger struct {
t time.Time
}
// NextFire return the time it will fire
func (trigger OneTimeTrigger) NextFire() time.Time {
return trigger.t
}
// RecurringTrigger is a trigger that fires every certain duration
type RecurringTrigger struct {
d time.Duration
created time.Time
stopped bool
}
// NewRecurringTrigger creates a new recurring trigger
func NewRecurringTrigger(d time.Duration) *RecurringTrigger {
return &RecurringTrigger{
d: d,
created: time.Now(),
stopped: false,
}
}
// NextFire returns a time when it will fire by a duration. This time starts since the creation of the trigger
func (trigger RecurringTrigger) NextFire() time.Time {
if trigger.stopped {
return past
}
now := time.Now()
diff := time.Since(trigger.created)
rem := diff % trigger.d
add := trigger.d - rem
return now.Add(add)
}
// Stop stops the trigger from firing
func (trigger *RecurringTrigger) Stop() {
trigger.stopped = true
}