github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/bob/playbook/status.go (about) 1 package playbook 2 3 import ( 4 "sync" 5 "time" 6 7 "github.com/benchkram/bob/bobtask" 8 ) 9 10 // Status holds the state of a task 11 // inside a playbook. 12 type Status struct { 13 *bobtask.Task 14 15 stateMu sync.RWMutex 16 state State 17 18 startMu sync.RWMutex 19 start time.Time 20 endMu sync.RWMutex 21 end time.Time 22 23 Error error 24 } 25 26 func NewStatus(task *bobtask.Task) *Status { 27 return &Status{ 28 Task: task, 29 state: StatePending, 30 start: time.Now(), 31 } 32 } 33 34 func (ts *Status) State() State { 35 ts.stateMu.RLock() 36 s := ts.state 37 ts.stateMu.RUnlock() 38 return s 39 } 40 41 func (ts *Status) SetState(s State, err error) { 42 ts.stateMu.Lock() 43 ts.state = s 44 ts.Error = err 45 ts.stateMu.Unlock() 46 } 47 48 func (ts *Status) ExecutionTime() time.Duration { 49 ts.startMu.RLock() 50 ts.endMu.RLock() 51 defer func() { 52 ts.startMu.RUnlock() 53 ts.endMu.RUnlock() 54 }() 55 56 return ts.end.Sub(ts.start) 57 } 58 59 func (ts *Status) Start() time.Time { 60 ts.startMu.RLock() 61 defer ts.startMu.RUnlock() 62 return ts.start 63 } 64 65 func (ts *Status) SetStart(start time.Time) { 66 ts.startMu.Lock() 67 defer ts.startMu.Unlock() 68 ts.start = start 69 } 70 71 func (ts *Status) End() time.Time { 72 ts.endMu.RLock() 73 defer ts.endMu.RUnlock() 74 return ts.end 75 } 76 77 func (ts *Status) SetEnd(end time.Time) { 78 ts.endMu.Lock() 79 defer ts.endMu.Unlock() 80 ts.end = end 81 }