pelican/internal/board/status.go
Dan Anglin fc5fa7b0ca
All checks were successful
/ test (pull_request) Successful in 28s
/ lint (pull_request) Successful in 37s
feat(BREAKING): specify project path
This PR allows users to specify the path to the database file
Pelican now expects the user to specify the path to the project's
database file which allows users to open different projects.

This is a breaking change because Pelican no longer opens the
default path automatically. If no path is set then Pelican stops
with an error message.
2023-12-12 12:47:58 +00:00

134 lines
2.6 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)
}
// 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,
},
}
}