59 lines
1.7 KiB
TypeScript
59 lines
1.7 KiB
TypeScript
import type { DeckCard, DeckCategory, TcgDeck } from '#lib/content';
|
|
import { findCardByName } from './api';
|
|
import { categoryOrder, categoryTitles } from './cardKind';
|
|
import { toBuilderCard, type BuilderEntry } from './deckBuilder.svelte';
|
|
import type { TcgCard } from './types';
|
|
|
|
export interface DeckSection {
|
|
category: DeckCategory;
|
|
title: string;
|
|
total: number;
|
|
cards: DeckCard[];
|
|
}
|
|
|
|
const lookups = new Map<string, Promise<TcgCard | null>>();
|
|
|
|
export function deckCardKey(card: DeckCard): string {
|
|
return `${card.name}|${card.set ?? ''}`;
|
|
}
|
|
|
|
export function deckSections(deck: TcgDeck): DeckSection[] {
|
|
return categoryOrder
|
|
.map((category) => {
|
|
const cards = deck.cards.filter((card) => card.category === category);
|
|
return {
|
|
category,
|
|
title: categoryTitles[category],
|
|
total: cards.reduce((sum, card) => sum + card.count, 0),
|
|
cards
|
|
};
|
|
})
|
|
.filter((section) => section.cards.length > 0);
|
|
}
|
|
|
|
export function deckTotal(deck: TcgDeck): number {
|
|
return deck.cards.reduce((sum, card) => sum + card.count, 0);
|
|
}
|
|
|
|
export function lookUpDeckCard(card: DeckCard): Promise<TcgCard | null> {
|
|
const key = deckCardKey(card);
|
|
const existing = lookups.get(key);
|
|
if (existing) return existing;
|
|
|
|
const lookup = findCardByName(card.name, card.set).catch((error) => {
|
|
lookups.delete(key);
|
|
throw error;
|
|
});
|
|
lookups.set(key, lookup);
|
|
return lookup;
|
|
}
|
|
|
|
export async function deckBuilderEntries(deck: TcgDeck): Promise<BuilderEntry[]> {
|
|
const entries: BuilderEntry[] = [];
|
|
for (const deckCard of deck.cards) {
|
|
const card = await lookUpDeckCard(deckCard).catch(() => null);
|
|
if (card) entries.push({ card: toBuilderCard(card), count: deckCard.count });
|
|
}
|
|
return entries;
|
|
}
|