48 lines
1 KiB
Go
48 lines
1 KiB
Go
package common
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strconv"
|
|
"text/template"
|
|
"time"
|
|
|
|
"dynatron.me/x/stillbox/internal/jsontypes"
|
|
)
|
|
|
|
var (
|
|
FuncMap = template.FuncMap{
|
|
"f": fmtFloat,
|
|
"dict": func(values ...interface{}) (map[string]interface{}, error) {
|
|
if len(values)%2 != 0 {
|
|
return nil, errors.New("invalid dict call")
|
|
}
|
|
dict := make(map[string]interface{}, len(values)/2)
|
|
for i := 0; i < len(values); i += 2 {
|
|
key, ok := values[i].(string)
|
|
if !ok {
|
|
return nil, errors.New("dict keys must be strings")
|
|
}
|
|
dict[key] = values[i+1]
|
|
}
|
|
return dict, nil
|
|
},
|
|
"formTime": func(t jsontypes.Time) string {
|
|
return time.Time(t).Format("2006-01-02T15:04")
|
|
},
|
|
"ago": func(s string) (string, error) {
|
|
d, err := time.ParseDuration(s)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return time.Now().Add(-d).Format("2006-01-02T15:04"), nil
|
|
},
|
|
}
|
|
)
|
|
|
|
func fmtFloat(v float64, places ...int) string {
|
|
if len(places) > 0 {
|
|
return fmt.Sprintf("%."+strconv.Itoa(places[0])+"f", v)
|
|
}
|
|
return fmt.Sprintf("%.4f", v)
|
|
}
|