gte/internal/storage/local.go

59 lines
975 B
Go
Raw Normal View History

2021-06-25 09:14:27 +02:00
package storage
import (
2021-07-10 12:30:38 +02:00
"errors"
2021-07-25 10:02:18 +02:00
"sort"
2021-06-25 09:14:27 +02:00
"time"
"git.ewintr.nl/gte/internal/task"
)
2021-07-10 12:30:38 +02:00
var (
ErrTaskNotFound = errors.New("task was not found")
)
2021-06-25 09:14:27 +02:00
type LocalRepository interface {
LatestSync() (time.Time, error)
SetTasks(tasks []*task.Task) error
2021-08-20 09:06:35 +02:00
FindAllInFolder(folder string) ([]*task.LocalTask, error)
FindAllInProject(project string) ([]*task.LocalTask, error)
FindById(id string) (*task.LocalTask, error)
FindByLocalId(id int) (*task.LocalTask, error)
2021-07-14 07:17:53 +02:00
}
func NextLocalId(used []int) int {
if len(used) == 0 {
return 1
}
2021-07-25 10:02:18 +02:00
sort.Ints(used)
2021-07-14 07:17:53 +02:00
usedMax := 1
for _, u := range used {
if u > usedMax {
usedMax = u
}
}
var limit int
for limit = 1; limit <= len(used) || limit < usedMax; limit *= 10 {
}
newId := used[len(used)-1] + 1
if newId < limit {
return newId
}
usedMap := map[int]bool{}
for _, u := range used {
usedMap[u] = true
}
for i := 1; i < limit; i++ {
if _, ok := usedMap[i]; !ok {
return i
}
}
return limit
2021-06-25 09:14:27 +02:00
}