aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-06-16 21:27:48 -0500
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:20 +0200
commitf9d0181147c7d6a31ea7e244cc7f4445a14d3cb8 (patch)
treef0fb5e4cc4c0d3d962f84ec1336e005aa734a4cf
parentbfd9052c2f5d42917cce3555eb83fc65ce95e5b8 (diff)
downloadmuhqs-game-f9d0181147c7d6a31ea7e244cc7f4445a14d3cb8.tar.gz
muhqs-game-f9d0181147c7d6a31ea7e244cc7f4445a14d3cb8.zip
make retrieveCardDefinition errors recoverable
This is needed ro test if a user provided path is an actual card and not crash the program if not.
-rw-r--r--go/game/card.go34
1 files changed, 25 insertions, 9 deletions
diff --git a/go/game/card.go b/go/game/card.go
index 90dd8f2b..70c591b7 100644
--- a/go/game/card.go
+++ b/go/game/card.go
@@ -162,24 +162,28 @@ type Card struct {
var cardDefinitions = map[string]map[string][]byte{}
-func getCardDefinition(set, cardName string) []byte {
+func getCardDefinition(set, cardName string) ([]byte, error) {
cardDefinition, found := cardDefinitions[set][cardName]
if !found {
- cardDefinition = retrieveCardDefinition(path.Join(set, cardName))
+ var err error
+ cardDefinition, err = retrieveCardDefinition(path.Join(set, cardName))
+ if err != nil {
+ return nil, err
+ }
if cardDefinitions[set] == nil {
cardDefinitions[set] = map[string][]byte{}
}
cardDefinitions[set][cardName] = cardDefinition
}
- return cardDefinition
+ return cardDefinition, nil
}
-func retrieveCardDefinition(cardPath string) []byte {
+func retrieveCardDefinition(cardPath string) ([]byte, error) {
url := PROTOCOL + path.Join(BASE_URL, CARD_DATA_URL, cardPath+".yml")
log.Printf("loading %s\n", url)
resp, err := http.Get(url)
if err != nil {
- log.Fatal(err)
+ return nil, err
}
defer resp.Body.Close()
@@ -187,7 +191,7 @@ func retrieveCardDefinition(cardPath string) []byte {
if err != nil {
log.Fatal(err)
}
- return data
+ return data, nil
}
func (card *Card) parseDefinition(definition []byte) {
@@ -323,11 +327,23 @@ func (card *Card) getAI() string {
return strings.Split(aiDesc[0], " ")[0]
}
+// Create a new card from the path.
+// Panic if the path is not valid.
func NewCard(cardPath string) *Card {
+ card, err := NewCardSafe(cardPath)
+ if err != nil {
+ log.Fatal(err)
+ }
+ return card
+}
+
+// Safely create a new card from the path.
+// Return an error if the path is invalid.
+func NewCardSafe(cardPath string) (*Card, error) {
cardName := path.Base(cardPath)
set := path.Dir(cardPath)
- cardDefinition := getCardDefinition(set, cardName)
+ cardDefinition, err := getCardDefinition(set, cardName)
c := Card{
Name: "",
@@ -335,10 +351,10 @@ func NewCard(cardPath string) *Card {
Type: undefinedCardType,
BuyCosts: nil,
PlayCosts: nil,
- Values: map[string]interface{}{},
+ Values: map[string]any{},
}
c.parseDefinition(cardDefinition)
- return &c
+ return &c, err
}
func (c *Card) Path() string {