aboutsummaryrefslogtreecommitdiff
path: root/poker/api.py
blob: 9faa89bf9c63d05b383a013c4e76ae76766cbb7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from fastapi import Body, FastAPI
from loguru import logger

from poker.constants import Suit, Value
from poker.models import Card, Hand
from poker.rank import rank_hand

app = FastAPI()

_CARD_PATTERN = r"\s".join(5 * ["(2|3|4|5|6|7|8|9|10|J|K|Q|A)[CDHS]"])
_SUIT_MAP = {
    "C": Suit.CLUBS,
    "D": Suit.DIAMONDS,
    "H": Suit.HEARTS,
    "S": Suit.SPADES,
}
_VALUE_MAP = {
    "2": Value.TWO,
    "3": Value.THREE,
    "4": Value.FOUR,
    "5": Value.FIVE,
    "6": Value.SIX,
    "7": Value.SEVEN,
    "8": Value.EIGHT,
    "9": Value.NINE,
    "10": Value.TEN,
    "J": Value.JACK,
    "Q": Value.QUEEN,
    "K": Value.KING,
    "A": Value.ACE,
}


@app.get("/")
async def health_check() -> str:
    """Health check endpoint."""
    return "OK"


@app.post("/rank")
def rank(body: str = Body(regex=_CARD_PATTERN, example="2H 3D 5S 10C KD")) -> str:
    """Rank hand.

    TODO: Improve error response.
    """
    logger.info(f"Input hand: {body}")
    cards = [
        Card(suit=_SUIT_MAP[card[-1]], value=_VALUE_MAP[card[:-1]])
        for card in body.split()
    ]

    ranked_hand = rank_hand(Hand(cards=cards))

    logger.info(f"Hand rank: {ranked_hand.rank}")

    return ranked_hand.description