-
Notifications
You must be signed in to change notification settings - Fork 0
/
tracked_operation.go
63 lines (55 loc) · 1.38 KB
/
tracked_operation.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 ana
import "time"
type TrackedOperationStatus uint64
const (
Ready TrackedOperationStatus = iota
Running
Finished
Failed
)
type TrackedOperation[P any, R any] struct {
Status TrackedOperationStatus
Key string
Target string
Payload *P
ReferenceTime time.Time
StartedAt time.Time
Timeout time.Time
Expiration time.Time
Result *R
Err error
}
func NewTrackedOperation[P any, R any](
status TrackedOperationStatus,
key string,
target string,
payload *P,
referenceTime time.Time,
startedAt time.Time,
timeout time.Time,
expiration time.Time,
result *R,
err error,
) *TrackedOperation[P, R] {
return &TrackedOperation[P, R]{
Status: status,
Key: key,
Target: target,
Payload: payload,
ReferenceTime: referenceTime,
StartedAt: startedAt,
Timeout: timeout,
Expiration: expiration,
Result: result,
Err: err,
}
}
func (operation *TrackedOperation[P, R]) isFinished() bool {
return operation.Status == Finished
}
func (operation *TrackedOperation[P, R]) isExpired() bool {
return operation.Expiration != time.Time{} && time.Now().After(operation.Expiration)
}
func (operation *TrackedOperation[P, R]) stillRunning() bool {
return operation.Status == Running && (operation.Timeout == time.Time{} || operation.Timeout.After(time.Now()))
}