v1.16.4
ADDED: * math, time functions to tplx/sprigx FIXED: * logging not initializing properly on some BSDs
This commit is contained in:
139
tplx/sprigx/funcs_tpl_time.go
Normal file
139
tplx/sprigx/funcs_tpl_time.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package sprigx
|
||||
|
||||
import (
|
||||
`errors`
|
||||
`strconv`
|
||||
`strings`
|
||||
`time`
|
||||
)
|
||||
|
||||
/*
|
||||
tmFmt formats time t using format string fstr.
|
||||
|
||||
While one certainly can do the same via e.g.
|
||||
|
||||
{{- $t := tmNow -}}
|
||||
{{ $t.Format $fstr }}
|
||||
|
||||
This takes a time.Time as the second (and last) parameter,
|
||||
allowing it to work in pipelines.
|
||||
*/
|
||||
func tmFmt(fstr string, t time.Time) (out string) {
|
||||
|
||||
out = t.Format(fstr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
tmParseMonth attempts to first try tmParseMonthInt
|
||||
and then tries tmParseMonthStr if v is not "numeric".
|
||||
*/
|
||||
func tmParseMonth(v any) (mon time.Month, err error) {
|
||||
|
||||
var s string
|
||||
|
||||
if mon, err = tmParseMonthInt(v); err != nil {
|
||||
if errors.Is(err, strconv.ErrSyntax) {
|
||||
// NaN
|
||||
err = nil
|
||||
} else {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// If it gets here, it's a non-numeric string.
|
||||
if s, err = toString(v); err != nil {
|
||||
return
|
||||
}
|
||||
if mon, err = tmParseMonthStr(s); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
tmParseMonthInt parses a number representation of month n to a time.Month.
|
||||
n may be any numeric type or a string representation of a number
|
||||
(or a custom type derived from those).
|
||||
|
||||
A negative integer (or float, etc.) will be converted to a positive one (e.g. -6 => 6 => time.June).
|
||||
|
||||
floats are rounded to the nearest integer.
|
||||
|
||||
The integer should map directly to the month constants in the time module:
|
||||
|
||||
* 1: January
|
||||
* 2: February
|
||||
* 3: March
|
||||
* 4: April
|
||||
* 5: May
|
||||
* 6: June
|
||||
* 7: July
|
||||
* 8: August
|
||||
* 9: September
|
||||
* 10: October
|
||||
* 11: November
|
||||
* 12: December
|
||||
|
||||
If n resolves to 0, mon will be the current month (as determined by time.Now).
|
||||
|
||||
If n resolves to > 12, err will be ErrBadMonth.
|
||||
*/
|
||||
func tmParseMonthInt(n any) (mon time.Month, err error) {
|
||||
|
||||
var i int
|
||||
|
||||
if i, _, err = toPosInt(n); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if i == 0 {
|
||||
mon = time.Now().Month()
|
||||
return
|
||||
}
|
||||
|
||||
if i > 12 {
|
||||
err = ErrBadMonth
|
||||
return
|
||||
}
|
||||
|
||||
mon = time.Month(i)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
tmParseMonthStr parses a string representation of month s to a time.Month.
|
||||
|
||||
It normalizes s to lowercase and only uses the first 3 characters
|
||||
(the minimum length needed to determine month name
|
||||
uniqueness - "June" vs. "July", "March" vs. "May").
|
||||
|
||||
An empty (or whitespace-only) string will use the current month (as determined by time.Now).
|
||||
*/
|
||||
func tmParseMonthStr(s string) (mon time.Month, err error) {
|
||||
|
||||
var i int
|
||||
var m time.Month
|
||||
|
||||
if strings.TrimSpace(s) == "" {
|
||||
mon = time.Now().Month()
|
||||
return
|
||||
}
|
||||
|
||||
s = strings.ToLower(strings.TrimSpace(s))[0:3]
|
||||
|
||||
for i = range 12 {
|
||||
m = time.Month(i + 1)
|
||||
if strings.ToLower(m.String())[0:3] == s {
|
||||
mon = m
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
err = ErrBadMonth
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user