zeit/z/entry.go

146 lines
4.1 KiB
Go
Raw Normal View History

2020-10-11 14:12:34 +00:00
package z
import (
2020-10-11 20:14:22 +00:00
"errors"
2020-10-15 21:44:04 +00:00
"strings"
2020-10-11 14:12:34 +00:00
"time"
2020-10-15 20:38:03 +00:00
"fmt"
"github.com/gookit/color"
2020-10-11 14:12:34 +00:00
)
type Entry struct {
ID string `json:"-"`
Begin time.Time `json:"begin,omitempty"`
Finish time.Time `json:"finish,omitempty"`
Project string `json:"project,omitempty"`
Task string `json:"task,omitempty"`
User string `json:"user,omitempty"`
}
func NewEntry(
id string,
begin string,
finish string,
project string,
task string,
user string) (Entry, error) {
2020-10-15 09:54:11 +00:00
var err error
newEntry := Entry{}
newEntry.ID = id
newEntry.Project = project
newEntry.Task = task
newEntry.User = user
_, err = newEntry.SetBeginFromString(begin)
if err != nil {
return Entry{}, err
}
_, err = newEntry.SetFinishFromString(finish)
if err != nil {
return Entry{}, err
}
if newEntry.IsFinishedAfterBegan() == false {
return Entry{}, errors.New("beginning time of tracking cannot be after finish time")
}
return newEntry, nil
}
2020-10-15 21:44:04 +00:00
func (entry *Entry) SetIDFromDatabaseKey(key string) (error) {
splitKey := strings.Split(key, ":")
if len(splitKey) < 3 || len(splitKey) > 3 {
return errors.New("not a valid database key")
}
entry.ID = splitKey[2]
return nil
}
2020-10-15 09:54:11 +00:00
func (entry *Entry) SetBeginFromString(begin string) (time.Time, error) {
2020-10-11 14:12:34 +00:00
var beginTime time.Time
var err error
if begin == "" {
beginTime = time.Now()
} else {
beginTime, err = ParseTime(begin)
if err != nil {
2020-10-15 09:54:11 +00:00
return beginTime, err
2020-10-11 14:12:34 +00:00
}
}
2020-10-15 09:54:11 +00:00
entry.Begin = beginTime
return beginTime, nil
}
func (entry *Entry) SetFinishFromString(finish string) (time.Time, error) {
var finishTime time.Time
var err error
2020-10-11 14:12:34 +00:00
if finish != "" {
finishTime, err = ParseTime(finish)
if err != nil {
2020-10-15 09:54:11 +00:00
return finishTime, err
2020-10-11 14:12:34 +00:00
}
}
2020-10-15 09:54:11 +00:00
entry.Finish = finishTime
return finishTime, nil
}
2020-10-11 20:14:36 +00:00
2020-10-15 09:54:11 +00:00
func (entry *Entry) IsFinishedAfterBegan() (bool) {
2020-10-15 20:38:03 +00:00
return (entry.Finish.IsZero() || entry.Begin.Before(entry.Finish))
}
2020-10-15 20:56:04 +00:00
func (entry *Entry) GetOutputForTrack(isRunning bool, wasRunning bool) (string) {
var outputPrefix string = ""
var outputSuffix string = ""
now := time.Now()
trackDiffNow := now.Sub(entry.Begin)
trackDiffNowOut := time.Time{}.Add(trackDiffNow)
if isRunning == true && wasRunning == false {
outputPrefix = "began tracking"
} else if isRunning == true && wasRunning == true {
outputPrefix = "tracking"
outputSuffix = fmt.Sprintf(" for %sh", color.FgLightWhite.Render(trackDiffNowOut.Format("15:04")))
} else if isRunning == false && wasRunning == false {
2020-10-15 20:38:03 +00:00
outputPrefix = "tracked"
}
if entry.Task != "" && entry.Project != "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s %s %s on %s%s\n", CharTrack, outputPrefix, color.FgLightWhite.Render(entry.Task), color.FgLightWhite.Render(entry.Project), outputSuffix)
2020-10-15 20:38:03 +00:00
} else if entry.Task != "" && entry.Project == "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s %s %s%s\n", CharTrack, outputPrefix, color.FgLightWhite.Render(entry.Task), outputSuffix)
2020-10-15 20:38:03 +00:00
} else if entry.Task == "" && entry.Project != "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s %s task on %s%s\n", CharTrack, outputPrefix, color.FgLightWhite.Render(entry.Project), outputSuffix)
2020-10-15 20:38:03 +00:00
}
2020-10-15 20:56:04 +00:00
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s %s task%s\n", CharTrack, outputPrefix, outputSuffix)
2020-10-15 20:38:03 +00:00
}
func (entry *Entry) GetOutputForFinish() (string) {
2020-10-15 20:56:04 +00:00
var outputSuffix string = ""
2020-10-15 20:38:03 +00:00
trackDiff := entry.Finish.Sub(entry.Begin)
trackDiffOut := time.Time{}.Add(trackDiff)
2020-10-15 20:56:04 +00:00
outputSuffix = fmt.Sprintf(" for %sh", color.FgLightWhite.Render(trackDiffOut.Format("15:04")))
2020-10-15 20:38:03 +00:00
if entry.Task != "" && entry.Project != "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s finished tracking %s on %s%s\n", CharFinish, color.FgLightWhite.Render(entry.Task), color.FgLightWhite.Render(entry.Project), outputSuffix)
2020-10-15 20:38:03 +00:00
} else if entry.Task != "" && entry.Project == "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s finished tracking %s%s\n", CharFinish, color.FgLightWhite.Render(entry.Task), outputSuffix)
2020-10-15 20:38:03 +00:00
} else if entry.Task == "" && entry.Project != "" {
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s finished tracking task on %s%s\n", CharFinish, color.FgLightWhite.Render(entry.Project), outputSuffix)
2020-10-15 20:38:03 +00:00
}
2020-10-15 21:07:36 +00:00
return fmt.Sprintf("%s finished tracking task%s\n", CharFinish, outputSuffix)
2020-10-11 14:12:34 +00:00
}