pelican/internal/board/status.go

142 lines
2.8 KiB
Go

package board
import (
"fmt"
"sort"
)
type StatusListEmptyError struct{}
func (e StatusListEmptyError) Error() string {
return "the status list must not be empty"
}
type StatusNotExistError struct {
ID int
}
func (e StatusNotExistError) Error() string {
return fmt.Sprintf("status ID '%d' does not exist in the database", e.ID)
}
type StatusNotEmptyError struct {
ID int
}
func (e StatusNotEmptyError) Error() string {
return fmt.Sprintf("status ID '%d' must contain no cards before deletion", e.ID)
}
// Status represents the status of the Kanban board.
type Status struct {
ID int
Name string
CardIds []int
Position int
}
// UpdateID updates the ID of the Status value.
func (s *Status) UpdateId(id int) {
s.ID = id
}
// Id returns the ID of the Status value.
func (s *Status) Id() int {
return s.ID
}
// AddCardID adds a card ID to the status' list of card IDs.
func (s *Status) AddCardID(cardID int) {
// Create a new list if it does not exist
// and then return.
if s.CardIds == nil {
s.CardIds = []int{cardID}
return
}
// Sort list if not sorted.
if !sort.IntsAreSorted(s.CardIds) {
sort.Ints(s.CardIds)
}
// Get index of the card's ID if it already exists in the list.
// Return if it already exists in the list
ind := sort.SearchInts(s.CardIds, cardID)
if ind < len(s.CardIds) && cardID == s.CardIds[ind] {
return
}
s.CardIds = append(s.CardIds, cardID)
sort.Ints(s.CardIds)
}
// RemoveCardID removes a card ID from the status' list of card IDs.
func (s *Status) RemoveCardID(cardID int) {
if s.CardIds == nil {
return
}
// Sort list if not sorted.
if !sort.IntsAreSorted(s.CardIds) {
sort.Ints(s.CardIds)
}
// Get index of id.
// If the card ID is somehow not in the list, then ind
// will be the index where the id can be inserted.
ind := sort.SearchInts(s.CardIds, cardID)
if ind >= len(s.CardIds) || cardID != s.CardIds[ind] {
return
}
if len(s.CardIds) == 1 {
s.CardIds = nil
return
}
// use append to eliminate the id from the new slice
s.CardIds = append(s.CardIds[:ind], s.CardIds[ind+1:]...)
}
// ByStatusPosition implements sort.Interface for []Status based on the status' position on the Kanban board.
type ByStatusPosition []Status
func (s ByStatusPosition) Len() int {
return len(s)
}
func (s ByStatusPosition) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s ByStatusPosition) Less(i, j int) bool {
return s[i].Position < s[j].Position
}
// defaultStatusList returns the default list of statuses.
func defaultStatusList() []Status {
return []Status{
{
ID: -1,
Name: "To Do",
Position: 1,
CardIds: nil,
},
{
ID: -1,
Name: "Doing",
Position: 2,
CardIds: nil,
},
{
ID: -1,
Name: "Done",
Position: 3,
CardIds: nil,
},
}
}