common/trace.go (68 lines of code) (raw):
package common
import (
"context"
"io"
"os"
"sync"
)
type Trace struct {
Writer io.Writer
cancelFunc context.CancelFunc
abortFunc context.CancelFunc
mutex sync.Mutex
}
const ExitCodeInvalidConfiguration = 3
type JobFailureData struct {
Reason JobFailureReason
ExitCode int
}
func (s *Trace) Write(p []byte) (n int, err error) {
s.mutex.Lock()
defer s.mutex.Unlock()
if s.Writer == nil {
return 0, os.ErrInvalid
}
return s.Writer.Write(p)
}
func (s *Trace) SetDebugModeEnabled(_ bool) {
}
func (s *Trace) Success() error {
return nil
}
func (s *Trace) Fail(err error, failureData JobFailureData) error {
return nil
}
func (s *Trace) SetCancelFunc(cancelFunc context.CancelFunc) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.cancelFunc = cancelFunc
}
func (s *Trace) Cancel() bool {
s.mutex.Lock()
defer s.mutex.Unlock()
if s.cancelFunc == nil {
return false
}
s.cancelFunc()
return true
}
func (s *Trace) SetAbortFunc(abortFunc context.CancelFunc) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.abortFunc = abortFunc
}
func (s *Trace) Abort() bool {
s.mutex.Lock()
defer s.mutex.Unlock()
if s.abortFunc == nil {
return false
}
// Abort always have much higher importance than Cancel
// as abort interrupts the execution
s.cancelFunc = nil
s.abortFunc()
return true
}
func (s *Trace) SetFailuresCollector(fc FailuresCollector) {}
func (s *Trace) SetSupportedFailureReasonMapper(f SupportedFailureReasonMapper) {}
func (s *Trace) IsStdout() bool {
return true
}