164 lines
3.0 KiB
Go
164 lines
3.0 KiB
Go
package gotime
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type Timer struct {
|
|
Id int
|
|
Beg time.Time
|
|
End time.Time
|
|
Tags []string
|
|
timeFormat string
|
|
}
|
|
|
|
// CreateTimerFromString takes a string in the format of the lines from the data file
|
|
// and builds a timer from it.
|
|
func CreateTimerFromString(st string) (*Timer, error) {
|
|
var err error
|
|
t := new(Timer)
|
|
t.timeFormat = "20060102T150405Z"
|
|
flds := strings.Fields(st)
|
|
if len(flds) > 1 && flds[0] == "inc" {
|
|
// Start Time
|
|
if len(flds) >= 2 {
|
|
if t.Beg, err = time.Parse(t.timeFormat, flds[1]); err != nil {
|
|
return t, err
|
|
}
|
|
}
|
|
// End Time
|
|
if len(flds) >= 4 && flds[2] == "-" {
|
|
if t.End, err = time.Parse(t.timeFormat, flds[3]); err != nil {
|
|
return t, err
|
|
}
|
|
}
|
|
var inTags bool
|
|
for i := range flds {
|
|
if flds[i] == "#" {
|
|
inTags = true
|
|
continue
|
|
}
|
|
if inTags {
|
|
tg := strings.Trim(flds[i], "\"")
|
|
t.AddTag(tg)
|
|
}
|
|
}
|
|
}
|
|
return t, err
|
|
}
|
|
|
|
func (t *Timer) Start() {
|
|
if t.Beg.IsZero() {
|
|
t.Beg = time.Now()
|
|
}
|
|
}
|
|
|
|
func (t *Timer) Stop() {
|
|
if t.End.IsZero() {
|
|
t.End = time.Now()
|
|
}
|
|
}
|
|
|
|
func (t *Timer) SetId(i int) {
|
|
t.Id = i
|
|
}
|
|
|
|
func (t *Timer) SetStart(tm time.Time) error {
|
|
if !t.End.IsZero() && !tm.Before(t.End) {
|
|
return errors.New("Beginning time must be before End")
|
|
}
|
|
t.Beg = tm
|
|
return nil
|
|
}
|
|
|
|
func (t *Timer) SetEnd(tm time.Time) error {
|
|
if !tm.After(t.Beg) {
|
|
return errors.New("End time must be after Beginning")
|
|
}
|
|
t.End = tm
|
|
return nil
|
|
}
|
|
|
|
func (t *Timer) IsRunning() bool {
|
|
return !t.Beg.IsZero() && t.End.IsZero()
|
|
}
|
|
|
|
// AddTag adds the tag tg to this timer
|
|
func (t *Timer) AddTag(tg string) {
|
|
if !t.HasTag(tg) {
|
|
t.Tags = append(t.Tags, tg)
|
|
}
|
|
}
|
|
|
|
// RemoveTag removes the tag tg from this timer
|
|
func (t *Timer) RemoveTag(tg string) {
|
|
for i := 0; i < len(t.Tags); i++ {
|
|
if t.Tags[i] == tg {
|
|
t.Tags = append(t.Tags[:i], t.Tags[i+1:]...)
|
|
}
|
|
}
|
|
}
|
|
|
|
// HasTag returns if this timer has the tag
|
|
func (t *Timer) HasTag(tg string) bool {
|
|
for i := range t.Tags {
|
|
if t.Tags[i] == tg {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (t *Timer) ToString() string {
|
|
if t.Beg.IsZero() {
|
|
return ""
|
|
}
|
|
timeFormat := "20060102T150405Z"
|
|
|
|
ret := "inc " + t.Beg.Format(timeFormat)
|
|
if !t.End.IsZero() {
|
|
ret += " - " + t.End.Format(timeFormat)
|
|
}
|
|
if len(t.Tags) > 0 {
|
|
ret += " # "
|
|
for i := range t.Tags {
|
|
if TagIsMultiword(t.Tags[i]) {
|
|
ret += "\""
|
|
}
|
|
ret += t.Tags[i]
|
|
if TagIsMultiword(t.Tags[i]) {
|
|
ret += "\""
|
|
}
|
|
ret += " "
|
|
}
|
|
ret = ret[:len(ret)-1]
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (t *Timer) ToJsonString() string {
|
|
if t.Beg.IsZero() {
|
|
return ""
|
|
}
|
|
timeFormat := "20060102T150405Z"
|
|
|
|
ret := "{\"start\":\"" + t.Beg.Format(timeFormat) + "\","
|
|
if !t.End.IsZero() {
|
|
ret += "\"end\":\"" + t.End.Format(timeFormat) + "\","
|
|
}
|
|
if len(t.Tags) > 0 {
|
|
ret += "\"tags\":["
|
|
for i := range t.Tags {
|
|
ret += "\"" + t.Tags[i] + "\","
|
|
}
|
|
// Move trailing ',' to end
|
|
ret = ret[:len(ret)-1] + "],"
|
|
|
|
}
|
|
// Trim trailing ,
|
|
ret = ret[:len(ret)-1] + "}"
|
|
return ret
|
|
}
|