mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2024-11-10 04:54:03 -08:00
171 lines
4.5 KiB
Go
171 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
lang "golang.org/x/text/language"
|
|
"golang.org/x/text/message"
|
|
)
|
|
|
|
type executiontime struct {
|
|
props *properties
|
|
env environmentInfo
|
|
output string
|
|
}
|
|
|
|
type DurationStyle string
|
|
|
|
const (
|
|
// ThresholdProperty represents minimum duration (milliseconds) required to enable this segment
|
|
ThresholdProperty Property = "threshold"
|
|
|
|
Austin DurationStyle = "austin"
|
|
Roundrock DurationStyle = "roundrock"
|
|
Dallas DurationStyle = "dallas"
|
|
Galveston DurationStyle = "galveston"
|
|
Houston DurationStyle = "houston"
|
|
Amarillo DurationStyle = "amarillo"
|
|
|
|
second = 1000
|
|
minute = 60000
|
|
hour = 3600000
|
|
day = 86400000
|
|
secondsPerMinute = 60
|
|
minutesPerHour = 60
|
|
hoursPerDay = 24
|
|
)
|
|
|
|
func (t *executiontime) enabled() bool {
|
|
executionTimeMs := t.env.executionTime()
|
|
thresholdMs := t.props.getFloat64(ThresholdProperty, float64(500))
|
|
if executionTimeMs < thresholdMs {
|
|
return false
|
|
}
|
|
style := DurationStyle(t.props.getString(Style, string(Austin)))
|
|
t.output = t.formatDuration(int64(executionTimeMs), style)
|
|
|
|
return t.output != ""
|
|
}
|
|
|
|
func (t *executiontime) string() string {
|
|
return t.output
|
|
}
|
|
|
|
func (t *executiontime) init(props *properties, env environmentInfo) {
|
|
t.props = props
|
|
t.env = env
|
|
}
|
|
|
|
func (t *executiontime) formatDuration(ms int64, style DurationStyle) string {
|
|
switch style {
|
|
case Austin:
|
|
return t.formatDurationAustin(ms)
|
|
case Roundrock:
|
|
return t.formatDurationRoundrock(ms)
|
|
case Dallas:
|
|
return t.formatDurationDallas(ms)
|
|
case Galveston:
|
|
return t.formatDurationGalveston(ms)
|
|
case Houston:
|
|
return t.formatDurationHouston(ms)
|
|
case Amarillo:
|
|
return t.formatDurationAmarillo(ms)
|
|
default:
|
|
return fmt.Sprintf("Style: %s is not available", style)
|
|
}
|
|
}
|
|
|
|
func (t *executiontime) formatDurationAustin(ms int64) string {
|
|
if ms < second {
|
|
return fmt.Sprintf("%dms", ms%second)
|
|
}
|
|
|
|
seconds := float64(ms%minute) / second
|
|
result := strconv.FormatFloat(seconds, 'f', -1, 64) + "s"
|
|
|
|
if ms >= minute {
|
|
result = fmt.Sprintf("%dm %s", ms/minute%secondsPerMinute, result)
|
|
}
|
|
if ms >= hour {
|
|
result = fmt.Sprintf("%dh %s", ms/hour%hoursPerDay, result)
|
|
}
|
|
if ms >= day {
|
|
result = fmt.Sprintf("%dd %s", ms/day, result)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (t *executiontime) formatDurationRoundrock(ms int64) string {
|
|
result := fmt.Sprintf("%dms", ms%second)
|
|
if ms >= second {
|
|
result = fmt.Sprintf("%ds %s", ms/second%secondsPerMinute, result)
|
|
}
|
|
if ms >= minute {
|
|
result = fmt.Sprintf("%dm %s", ms/minute%minutesPerHour, result)
|
|
}
|
|
if ms >= hour {
|
|
result = fmt.Sprintf("%dh %s", ms/hour%hoursPerDay, result)
|
|
}
|
|
if ms >= day {
|
|
result = fmt.Sprintf("%dd %s", ms/day, result)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (t *executiontime) formatDurationDallas(ms int64) string {
|
|
seconds := float64(ms%minute) / second
|
|
result := strconv.FormatFloat(seconds, 'f', -1, 64)
|
|
|
|
if ms >= minute {
|
|
result = fmt.Sprintf("%d:%s", ms/minute%minutesPerHour, result)
|
|
}
|
|
if ms >= hour {
|
|
result = fmt.Sprintf("%d:%s", ms/hour%hoursPerDay, result)
|
|
}
|
|
if ms >= day {
|
|
result = fmt.Sprintf("%d:%s", ms/day, result)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (t *executiontime) formatDurationGalveston(ms int64) string {
|
|
result := fmt.Sprintf("%02d:%02d:%02d", ms/hour, ms/minute%minutesPerHour, ms%minute/second)
|
|
return result
|
|
}
|
|
|
|
func (t *executiontime) formatDurationHouston(ms int64) string {
|
|
milliseconds := ".0"
|
|
if ms%second > 0 {
|
|
// format milliseconds as a string with truncated trailing zeros
|
|
milliseconds = strconv.FormatFloat(float64(ms%second)/second, 'f', -1, 64)
|
|
// at this point milliseconds looks like "0.5". remove the leading "0"
|
|
milliseconds = milliseconds[1:]
|
|
}
|
|
|
|
result := fmt.Sprintf("%02d:%02d:%02d%s", ms/hour, ms/minute%minutesPerHour, ms%minute/second, milliseconds)
|
|
return result
|
|
}
|
|
|
|
func (t *executiontime) formatDurationAmarillo(ms int64) string {
|
|
// wholeNumber represents the value to the left of the decimal point (seconds)
|
|
wholeNumber := ms / second
|
|
// decimalNumber represents the value to the right of the decimal point (milliseconds)
|
|
decimalNumber := float64(ms%second) / second
|
|
|
|
// format wholeNumber as a string with thousands separators
|
|
printer := message.NewPrinter(lang.English)
|
|
result := printer.Sprintf("%d", wholeNumber)
|
|
|
|
if decimalNumber > 0 {
|
|
// format decimalNumber as a string with truncated trailing zeros
|
|
decimalResult := strconv.FormatFloat(decimalNumber, 'f', -1, 64)
|
|
// at this point decimalResult looks like "0.5"
|
|
// remove the leading "0" and append
|
|
result += decimalResult[1:]
|
|
}
|
|
result += "s"
|
|
|
|
return result
|
|
}
|