planner/plan/storage/storage.go

70 lines
1.0 KiB
Go
Raw Normal View History

2024-09-30 07:34:40 +02:00
package storage
2024-10-03 07:32:48 +02:00
import (
"errors"
"sort"
2024-09-30 07:34:40 +02:00
2024-10-03 07:32:48 +02:00
"go-mod.ewintr.nl/planner/item"
)
var (
ErrNotFound = errors.New("not found")
)
type LocalID interface {
FindAll() (map[string]int, error)
2024-10-15 07:28:46 +02:00
FindOrNext(id string) (int, error)
2024-10-03 07:32:48 +02:00
Next() (int, error)
Store(id string, localID int) error
Delete(id string) error
}
2024-10-11 07:24:38 +02:00
type Sync interface {
FindAll() ([]item.Item, error)
Store(i item.Item) error
DeleteAll() error
}
2024-10-03 07:32:48 +02:00
type Event interface {
2024-09-30 07:34:40 +02:00
Store(event item.Event) error
Find(id string) (item.Event, error)
FindAll() ([]item.Event, error)
Delete(id string) error
}
2024-10-03 07:32:48 +02:00
func NextLocalID(used []int) int {
if len(used) == 0 {
return 1
}
sort.Ints(used)
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
}