GildedRose-Refactoring-Kata/go/gildedrose/gildedrose.go
2024-05-21 09:57:00 +02:00

97 lines
2.1 KiB
Go

package gildedrose
import (
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose/domain"
)
const (
AgedBrie = "Aged Brie"
BackstagePasses = "Backstage passes to a TAFKAL80ETC concert"
Sulfuras = "Sulfuras, Hand of Ragnaros"
Conjured = "Conjured Mana Cake"
MaxQuality = 50
MinQuality = 0
SulfurasQuality = 80
Expired = 0
Backstage10Days = 10
Backstage5Days = 5
NormalDegradeRate = 1
ConjuredDegradeRate = 2
)
func UpdateQuality(items []*domain.Item) {
for _, item := range items {
updateItem(item)
validateQuality(item)
}
}
func validateQuality(item *domain.Item) {
if item.Name == Sulfuras {
if item.Quality != SulfurasQuality {
item.Quality = SulfurasQuality
}
return
}
if item.Quality > MaxQuality || item.Quality < MinQuality {
item.Quality = MinQuality
}
}
func updateItem(item *domain.Item) {
switch item.Name {
case AgedBrie:
incrementQuality(item)
case BackstagePasses:
updateBackstagePasses(item)
case Sulfuras:
// Sulfuras does not change in quality or sell-in
case Conjured:
degradeQuality(item, ConjuredDegradeRate)
default:
degradeQuality(item, NormalDegradeRate)
}
if item.Name != Sulfuras {
item.SellIn--
}
if item.SellIn < Expired {
handleExpiredItem(item)
}
}
func incrementQuality(item *domain.Item) {
if item.Quality < MaxQuality {
item.Quality++
}
}
func updateBackstagePasses(item *domain.Item) {
incrementQuality(item)
if item.SellIn <= Backstage10Days && item.Quality < MaxQuality {
item.Quality++
}
if item.SellIn <= Backstage5Days && item.Quality < MaxQuality {
item.Quality++
}
}
func degradeQuality(item *domain.Item, degradeRate int) {
if item.Quality > MinQuality {
item.Quality -= degradeRate
}
}
func handleExpiredItem(item *domain.Item) {
switch item.Name {
case AgedBrie:
incrementQuality(item)
case BackstagePasses:
item.Quality = MinQuality
case Conjured:
degradeQuality(item, ConjuredDegradeRate)
case Sulfuras:
// Sulfuras does not change in quality or sell-in
default:
degradeQuality(item, NormalDegradeRate)
}
}