package board import ( "sort" ) // Status represents the status of the Kanban board. type Status struct { ID int Name string CardIds []int Order 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:]...) } // ByStatusOrder implements sort.Interface for []Status based on the Order field. type ByStatusOrder []Status func (s ByStatusOrder) Len() int { return len(s) } func (s ByStatusOrder) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s ByStatusOrder) Less(i, j int) bool { return s[i].Order < s[j].Order } // defaultStatusList returns the default list of statuses. func defaultStatusList() []Status { return []Status{ { ID: -1, Name: "To Do", Order: 1, CardIds: nil, }, { ID: -1, Name: "Doing", Order: 2, CardIds: nil, }, { ID: -1, Name: "Done", Order: 3, CardIds: nil, }, } }