aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-06-16 21:42:11 -0500
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:20 +0200
commitd0ef05a6aa0464dec5deb02741f159bee6050bbc (patch)
tree517000a63320d0694b737bc2a4f75099be98ac00
parentf9d0181147c7d6a31ea7e244cc7f4445a14d3cb8 (diff)
downloadmuhqs-game-d0ef05a6aa0464dec5deb02741f159bee6050bbc.tar.gz
muhqs-game-d0ef05a6aa0464dec5deb02741f159bee6050bbc.zip
support marshaling and unmarshaling of PoCs
-rw-r--r--go/game/pileOfCards.go32
-rw-r--r--go/game/pileOfCards_test.go25
2 files changed, 57 insertions, 0 deletions
diff --git a/go/game/pileOfCards.go b/go/game/pileOfCards.go
index 0ad0f157..88a3c750 100644
--- a/go/game/pileOfCards.go
+++ b/go/game/pileOfCards.go
@@ -1,8 +1,10 @@
package game
import (
+ "errors"
"fmt"
"math/rand"
+ "strings"
"golang.org/x/exp/slices"
)
@@ -28,6 +30,36 @@ func NewPileOfCards() *PileOfCardsBase {
return &PileOfCardsBase{[]*Card{}}
}
+// Stringify to a []-bracket enclosed comma-seperated list of card names.
+func (poc *PileOfCardsBase) String() string {
+ cardNames := make([]string, 0, len(poc.Cards()))
+ for _, card := range poc.Cards() {
+ cardNames = append(cardNames, card.Path())
+ }
+ return fmt.Sprintf("[%s]", strings.Join(cardNames, ", "))
+}
+
+var InvalidPocString = errors.New("Invalid PileOfCards format")
+
+// Initialise a PileOfCard from a string.
+// Return InvalidPocString on error.
+func (poc *PileOfCardsBase) FromString(in string) error {
+ if in[0] != '[' || in[len(in)-1] != ']' {
+ return InvalidPocString
+ }
+
+ in = in[1 : len(in)-1]
+
+ for cardName := range strings.SplitSeq(in, ", ") {
+ if card, err := NewCardSafe(cardName); err != nil {
+ return err
+ } else {
+ poc.AddCard(card)
+ }
+ }
+ return nil
+}
+
func (poc *PileOfCardsBase) Size() int {
return len(poc.cards)
}
diff --git a/go/game/pileOfCards_test.go b/go/game/pileOfCards_test.go
new file mode 100644
index 00000000..0c9532fe
--- /dev/null
+++ b/go/game/pileOfCards_test.go
@@ -0,0 +1,25 @@
+package game
+
+import (
+ "testing"
+)
+
+func TestPocToString(t *testing.T) {
+ poc := NewPileOfCards()
+ cards := []*Card{NewCard("base/archer"), NewCard("magic/ritual!")}
+ poc.AddCards(cards)
+ exp := "[base/archer, magic/ritual!]"
+ is := poc.String()
+ if is != exp {
+ t.Fatalf("expected string %s does not match %s\n", exp, is)
+ }
+}
+
+func TestPocFromString(t *testing.T) {
+ poc := NewPileOfCards()
+ in := "[base/archer, magic/ritual!]"
+ err := poc.FromString(in)
+ if err != nil {
+ t.Fatal(err)
+ }
+}