zeit/z/helpers.go

127 lines
2.7 KiB
Go
Raw Normal View History

2020-10-11 14:12:41 +00:00
package z
import (
2020-10-16 16:02:41 +00:00
"fmt"
2020-10-11 14:12:41 +00:00
"os/user"
"regexp"
"strconv"
"time"
"errors"
)
const (
TFAbsTwelveHour int = 0
TFAbsTwentyfourHour int = 1
TFRelHourMinute int = 2
TFRelHourFraction int = 3
)
func TimeFormats() []string {
return []string{
`^\d{1,2}:\d{1,2}(am|pm)$`, // Absolute twelve hour format
`^\d{1,2}:\d{1,2}$`, // Absolute twenty four hour format
`^([+-])(\d{1,2}):(\d{1,2})$`, // Relative hour:minute format
`^([+-])(\d{1,2})\.(\d{1,2})$`, // Relative hour.fraction format
}
}
func GetCurrentUser() (string) {
user, err := user.Current()
if err != nil {
return "unknown"
}
return user.Username
}
func GetTimeFormat(timeStr string) (int) {
var matched bool
var regerr error
for timeFormatId, timeFormat := range TimeFormats() {
matched, regerr = regexp.MatchString(timeFormat, timeStr)
if regerr != nil {
return -1
}
if matched == true {
return timeFormatId
}
}
return -1
}
func RelToTime(timeStr string, ftId int) (time.Time, error) {
var re = regexp.MustCompile(TimeFormats()[ftId])
gm := re.FindStringSubmatch(timeStr)
if len(gm) < 4 {
return time.Now(), errors.New("No match")
}
var hours int = 0
var minutes int = 0
if ftId == TFRelHourFraction {
f, _ := strconv.ParseFloat(gm[2] + "." + gm[3], 32)
minutes = int(f * 60.0)
} else {
hours, _ = strconv.Atoi(gm[2])
minutes, _ = strconv.Atoi(gm[3])
}
var t time.Time
switch gm[1] {
case "+":
t = time.Now().Local().Add(time.Hour * time.Duration(hours) + time.Minute * time.Duration(minutes))
case "-":
t = time.Now().Local().Add((time.Hour * time.Duration(hours) + time.Minute * time.Duration(minutes)) * -1)
}
return t, nil
}
func ParseTime(timeStr string) (time.Time, error) {
tfId := GetTimeFormat(timeStr)
switch tfId {
case TFAbsTwelveHour:
return time.Parse("3:04pm", timeStr)
case TFAbsTwentyfourHour:
return time.Parse("15:04", timeStr)
case TFRelHourMinute, TFRelHourFraction:
return RelToTime(timeStr, tfId)
default:
return time.Now(), errors.New("No match")
}
}
2020-10-16 16:02:41 +00:00
func OutputAppendRight(leftStr string, rightStr string, pad int) (string) {
var output string = ""
var rpos int = 0
left := []rune(leftStr)
right := []rune(rightStr)
for lpos := 0; lpos < len(left); lpos++ {
if left[lpos] == '\n' || lpos == (len(left) - 1) {
output = fmt.Sprintf("%s%*s", output, pad, "")
for rpos = rpos; rpos < len(right); rpos++ {
output = fmt.Sprintf("%s%c", output, right[rpos])
if right[rpos] == '\n' {
rpos++
break
}
}
continue
}
output = fmt.Sprintf("%s%c", output, left[lpos])
}
return output
}