| 0 | 0 |
package decor
|
| 1 | 1 |
|
| 2 | 2 |
import (
|
| 3 | |
"fmt"
|
| 4 | 3 |
"time"
|
| 5 | 4 |
)
|
| 6 | 5 |
|
| 7 | |
// Elapsed returns elapsed time decorator.
|
|
6 |
// Elapsed decorator. It's wrapper of NewElapsed.
|
| 8 | 7 |
//
|
| 9 | 8 |
// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS]
|
| 10 | 9 |
//
|
| 11 | 10 |
// `wcc` optional WC config
|
| 12 | 11 |
func Elapsed(style TimeStyle, wcc ...WC) Decorator {
|
|
12 |
return NewElapsed(style, time.Now(), wcc...)
|
|
13 |
}
|
|
14 |
|
|
15 |
// NewElapsed returns elapsed time decorator.
|
|
16 |
//
|
|
17 |
// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS]
|
|
18 |
//
|
|
19 |
// `startTime` start time
|
|
20 |
//
|
|
21 |
// `wcc` optional WC config
|
|
22 |
func NewElapsed(style TimeStyle, startTime time.Time, wcc ...WC) Decorator {
|
| 13 | 23 |
var wc WC
|
| 14 | 24 |
for _, widthConf := range wcc {
|
| 15 | 25 |
wc = widthConf
|
|
| 17 | 27 |
wc.Init()
|
| 18 | 28 |
d := &elapsedDecorator{
|
| 19 | 29 |
WC: wc,
|
| 20 | |
style: style,
|
| 21 | |
startTime: time.Now(),
|
|
30 |
startTime: startTime,
|
|
31 |
producer: chooseTimeProducer(style),
|
| 22 | 32 |
}
|
| 23 | 33 |
return d
|
| 24 | 34 |
}
|
| 25 | 35 |
|
| 26 | 36 |
type elapsedDecorator struct {
|
| 27 | 37 |
WC
|
| 28 | |
style TimeStyle
|
| 29 | 38 |
startTime time.Time
|
|
39 |
producer func(time.Duration) string
|
| 30 | 40 |
msg string
|
| 31 | 41 |
completeMsg *string
|
| 32 | 42 |
}
|
|
| 39 | 49 |
return d.FormatMsg(d.msg)
|
| 40 | 50 |
}
|
| 41 | 51 |
|
| 42 | |
timeElapsed := time.Since(d.startTime)
|
| 43 | |
hours := int64((timeElapsed / time.Hour) % 60)
|
| 44 | |
minutes := int64((timeElapsed / time.Minute) % 60)
|
| 45 | |
seconds := int64((timeElapsed / time.Second) % 60)
|
| 46 | |
|
| 47 | |
switch d.style {
|
| 48 | |
case ET_STYLE_GO:
|
| 49 | |
d.msg = fmt.Sprint(time.Duration(timeElapsed.Seconds()) * time.Second)
|
| 50 | |
case ET_STYLE_HHMMSS:
|
| 51 | |
d.msg = fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)
|
| 52 | |
case ET_STYLE_HHMM:
|
| 53 | |
d.msg = fmt.Sprintf("%02d:%02d", hours, minutes)
|
| 54 | |
case ET_STYLE_MMSS:
|
| 55 | |
if hours > 0 {
|
| 56 | |
d.msg = fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)
|
| 57 | |
} else {
|
| 58 | |
d.msg = fmt.Sprintf("%02d:%02d", minutes, seconds)
|
| 59 | |
}
|
| 60 | |
}
|
| 61 | |
|
|
52 |
d.msg = d.producer(time.Since(d.startTime))
|
| 62 | 53 |
return d.FormatMsg(d.msg)
|
| 63 | 54 |
}
|
| 64 | 55 |
|