From d0ef05a6aa0464dec5deb02741f159bee6050bbc Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Mon, 16 Jun 2025 21:42:11 -0500 Subject: support marshaling and unmarshaling of PoCs --- go/game/pileOfCards.go | 32 ++++++++++++++++++++++++++++++++ go/game/pileOfCards_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 go/game/pileOfCards_test.go 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) + } +} -- cgit v1.2.3