You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
|
|
module Worldcup.Games (Game(..), parseGames) where
|
|
|
|
import Data.Aeson
|
|
import Data.Aeson.Types
|
|
|
|
data Game = Game {
|
|
gamePlayAt :: String,
|
|
gameRoundId :: Int,
|
|
gameTeam1Id :: Int,
|
|
gameTeam2Id :: Int,
|
|
gameScore1 :: Value,
|
|
gameScore2 :: Value,
|
|
gameScore1et :: Value,
|
|
gameScore2et :: Value,
|
|
gameScore1p :: Value,
|
|
gameScore2p :: Value } deriving (Show)
|
|
|
|
instance ToJSON Game where
|
|
toJSON Game{..} = object [
|
|
"ts" .= gamePlayAt,
|
|
"rId" .= gameRoundId,
|
|
"t1" .= gameTeam1Id,
|
|
"t2" .= gameTeam2Id,
|
|
"s1" .= gameScore1,
|
|
"se1" .= gameScore1et,
|
|
"sp1" .= gameScore1p,
|
|
"s2" .= gameScore2,
|
|
"se2" .= gameScore2et,
|
|
"sp2" .= gameScore2p ]
|
|
|
|
instance FromJSON Game where
|
|
parseJSON = withObject "game" $ \o -> do
|
|
gameRoundId <- o .: "round_id"
|
|
gameTeam1Id <- o .: "team1_id"
|
|
gameTeam2Id <- o .: "team2_id"
|
|
gamePlayAt <- o .: "play_at"
|
|
gameScore1 <- o .: "score1"
|
|
gameScore2 <- o .: "score2"
|
|
gameScore1et <- o .: "score1et"
|
|
gameScore2et <- o .: "score2et"
|
|
gameScore1p <- o .: "score1p"
|
|
gameScore2p <- o .: "score2p"
|
|
return Game{..}
|
|
|
|
parseGames :: Either String [Value] -> [Game]
|
|
parseGames (Left x) = error x
|
|
parseGames (Right xs) = foldl reduce [] xs where
|
|
reduce acc x = case (parseEither parseJSON x :: Either String Game) of
|
|
(Left s) -> error s
|
|
(Right v) -> v : acc
|
|
|