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  }