aboutsummaryrefslogtreecommitdiff
path: root/poker/api.py
diff options
context:
space:
mode:
Diffstat (limited to 'poker/api.py')
-rw-r--r--poker/api.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/poker/api.py b/poker/api.py
new file mode 100644
index 0000000..9faa89b
--- /dev/null
+++ b/poker/api.py
@@ -0,0 +1,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