diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-06-16 21:27:48 -0500 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:57:20 +0200 |
| commit | f9d0181147c7d6a31ea7e244cc7f4445a14d3cb8 (patch) | |
| tree | f0fb5e4cc4c0d3d962f84ec1336e005aa734a4cf | |
| parent | bfd9052c2f5d42917cce3555eb83fc65ce95e5b8 (diff) | |
| download | muhqs-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.go | 34 |
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 { |
