mirror of
https://github.com/Threnklyn/zeit.git
synced 2026-05-19 05:13:31 +02:00
119 lines
3.2 KiB
Go
119 lines
3.2 KiB
Go
package z
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
"fmt"
|
|
"github.com/gookit/color"
|
|
)
|
|
|
|
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) {
|
|
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
|
|
}
|
|
|
|
func (entry *Entry) SetBeginFromString(begin string) (time.Time, error) {
|
|
var beginTime time.Time
|
|
var err error
|
|
|
|
if begin == "" {
|
|
beginTime = time.Now()
|
|
} else {
|
|
beginTime, err = ParseTime(begin)
|
|
if err != nil {
|
|
return beginTime, err
|
|
}
|
|
}
|
|
|
|
entry.Begin = beginTime
|
|
return beginTime, nil
|
|
}
|
|
|
|
func (entry *Entry) SetFinishFromString(finish string) (time.Time, error) {
|
|
var finishTime time.Time
|
|
var err error
|
|
|
|
if finish != "" {
|
|
finishTime, err = ParseTime(finish)
|
|
if err != nil {
|
|
return finishTime, err
|
|
}
|
|
}
|
|
|
|
entry.Finish = finishTime
|
|
return finishTime, nil
|
|
}
|
|
|
|
func (entry *Entry) IsFinishedAfterBegan() (bool) {
|
|
return (entry.Finish.IsZero() || entry.Begin.Before(entry.Finish))
|
|
}
|
|
|
|
func (entry *Entry) GetOutputForTrack(isRunning bool) (string) {
|
|
outputPrefix := "began tracking"
|
|
if isRunning == false {
|
|
outputPrefix = "tracked"
|
|
}
|
|
|
|
if entry.Task != "" && entry.Project != "" {
|
|
return fmt.Sprintf("▷ %s %s on %s\n", outputPrefix, color.FgLightWhite.Render(entry.Task), color.FgLightWhite.Render(entry.Project))
|
|
} else if entry.Task != "" && entry.Project == "" {
|
|
return fmt.Sprintf("▷ %s %s\n", outputPrefix, color.FgLightWhite.Render(entry.Task))
|
|
} else if entry.Task == "" && entry.Project != "" {
|
|
return fmt.Sprintf("▷ %s task on %s\n", outputPrefix, color.FgLightWhite.Render(entry.Project))
|
|
} else {
|
|
return fmt.Sprintf("▷ %s task\n", outputPrefix)
|
|
}
|
|
}
|
|
|
|
func (entry *Entry) GetOutputForFinish() (string) {
|
|
trackDiff := entry.Finish.Sub(entry.Begin)
|
|
trackDiffOut := time.Time{}.Add(trackDiff)
|
|
|
|
if entry.Task != "" && entry.Project != "" {
|
|
return fmt.Sprintf("□ finished tracking %s on %s for %sh\n", color.FgLightWhite.Render(entry.Task), color.FgLightWhite.Render(entry.Project), trackDiffOut.Format("15:04"))
|
|
} else if entry.Task != "" && entry.Project == "" {
|
|
return fmt.Sprintf("□ finished tracking %s for %sh\n", color.FgLightWhite.Render(entry.Task), trackDiffOut.Format("15:04"))
|
|
} else if entry.Task == "" && entry.Project != "" {
|
|
return fmt.Sprintf("□ finished tracking task on %s for %sh\n", color.FgLightWhite.Render(entry.Project), trackDiffOut.Format("15:04"))
|
|
}
|
|
|
|
return fmt.Sprintf("□ finished tracking task\n")
|
|
}
|