{-# LANGUAGE DataKinds #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Swarm.Web.Tournament.Type where
import Data.Aeson
import Data.ByteString.Lazy qualified as LBS
import Data.Text qualified as T
import Data.Text.Lazy qualified as TL
import Data.Time (UTCTime)
import Database.SQLite.Simple.ToField
import GHC.Generics (Generic)
import Servant
import Servant.Docs (ToCapture)
import Servant.Docs qualified as SD
import Swarm.Game.Scenario.Scoring.CodeSize
import Swarm.Game.State (Sha1 (..))
import Swarm.Game.Tick (TickNumber (..))
import Swarm.Game.World.Gen (Seed)
import System.Time.Extra
newtype UserAlias = UserAlias TL.Text
deriving ((forall x. UserAlias -> Rep UserAlias x)
-> (forall x. Rep UserAlias x -> UserAlias) -> Generic UserAlias
forall x. Rep UserAlias x -> UserAlias
forall x. UserAlias -> Rep UserAlias x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UserAlias -> Rep UserAlias x
from :: forall x. UserAlias -> Rep UserAlias x
$cto :: forall x. Rep UserAlias x -> UserAlias
to :: forall x. Rep UserAlias x -> UserAlias
Generic, [UserAlias] -> Value
[UserAlias] -> Encoding
UserAlias -> Bool
UserAlias -> Value
UserAlias -> Encoding
(UserAlias -> Value)
-> (UserAlias -> Encoding)
-> ([UserAlias] -> Value)
-> ([UserAlias] -> Encoding)
-> (UserAlias -> Bool)
-> ToJSON UserAlias
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: UserAlias -> Value
toJSON :: UserAlias -> Value
$ctoEncoding :: UserAlias -> Encoding
toEncoding :: UserAlias -> Encoding
$ctoJSONList :: [UserAlias] -> Value
toJSONList :: [UserAlias] -> Value
$ctoEncodingList :: [UserAlias] -> Encoding
toEncodingList :: [UserAlias] -> Encoding
$comitField :: UserAlias -> Bool
omitField :: UserAlias -> Bool
ToJSON)
instance ToField UserAlias where
toField :: UserAlias -> SQLData
toField (UserAlias Text
x) = Text -> SQLData
forall a. ToField a => a -> SQLData
toField Text
x
instance ToField Sha1 where
toField :: Sha1 -> SQLData
toField (Sha1 String
x) = String -> SQLData
forall a. ToField a => a -> SQLData
toField String
x
data FileMetadata = FileMetadata
{ FileMetadata -> Text
filename :: T.Text
, FileMetadata -> Sha1
fileHash :: Sha1
}
deriving ((forall x. FileMetadata -> Rep FileMetadata x)
-> (forall x. Rep FileMetadata x -> FileMetadata)
-> Generic FileMetadata
forall x. Rep FileMetadata x -> FileMetadata
forall x. FileMetadata -> Rep FileMetadata x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FileMetadata -> Rep FileMetadata x
from :: forall x. FileMetadata -> Rep FileMetadata x
$cto :: forall x. Rep FileMetadata x -> FileMetadata
to :: forall x. Rep FileMetadata x -> FileMetadata
Generic, [FileMetadata] -> Value
[FileMetadata] -> Encoding
FileMetadata -> Bool
FileMetadata -> Value
FileMetadata -> Encoding
(FileMetadata -> Value)
-> (FileMetadata -> Encoding)
-> ([FileMetadata] -> Value)
-> ([FileMetadata] -> Encoding)
-> (FileMetadata -> Bool)
-> ToJSON FileMetadata
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: FileMetadata -> Value
toJSON :: FileMetadata -> Value
$ctoEncoding :: FileMetadata -> Encoding
toEncoding :: FileMetadata -> Encoding
$ctoJSONList :: [FileMetadata] -> Value
toJSONList :: [FileMetadata] -> Value
$ctoEncodingList :: [FileMetadata] -> Encoding
toEncodingList :: [FileMetadata] -> Encoding
$comitField :: FileMetadata -> Bool
omitField :: FileMetadata -> Bool
ToJSON)
data FileUpload = FileUpload
{ FileUpload -> ByteString
fileContent :: LBS.ByteString
, FileUpload -> FileMetadata
fileMetadata :: FileMetadata
}
data TournamentGame = TournamentGame
{ TournamentGame -> Text
originalFilename :: T.Text
, TournamentGame -> Text
scenarioUploader :: T.Text
, TournamentGame -> Sha1
scenarioHash :: Sha1
, TournamentGame -> Int
submissionCount :: Int
, TournamentGame -> Sha1
swarmGitSha1 :: Sha1
, TournamentGame -> Text
scenarioTitle :: T.Text
}
deriving ((forall x. TournamentGame -> Rep TournamentGame x)
-> (forall x. Rep TournamentGame x -> TournamentGame)
-> Generic TournamentGame
forall x. Rep TournamentGame x -> TournamentGame
forall x. TournamentGame -> Rep TournamentGame x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TournamentGame -> Rep TournamentGame x
from :: forall x. TournamentGame -> Rep TournamentGame x
$cto :: forall x. Rep TournamentGame x -> TournamentGame
to :: forall x. Rep TournamentGame x -> TournamentGame
Generic, [TournamentGame] -> Value
[TournamentGame] -> Encoding
TournamentGame -> Bool
TournamentGame -> Value
TournamentGame -> Encoding
(TournamentGame -> Value)
-> (TournamentGame -> Encoding)
-> ([TournamentGame] -> Value)
-> ([TournamentGame] -> Encoding)
-> (TournamentGame -> Bool)
-> ToJSON TournamentGame
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: TournamentGame -> Value
toJSON :: TournamentGame -> Value
$ctoEncoding :: TournamentGame -> Encoding
toEncoding :: TournamentGame -> Encoding
$ctoJSONList :: [TournamentGame] -> Value
toJSONList :: [TournamentGame] -> Value
$ctoEncodingList :: [TournamentGame] -> Encoding
toEncodingList :: [TournamentGame] -> Encoding
$comitField :: TournamentGame -> Bool
omitField :: TournamentGame -> Bool
ToJSON)
data TournamentSolution = TournamentSolution
{ TournamentSolution -> UTCTime
submissionTime :: UTCTime
, TournamentSolution -> Text
solutionSubmitter :: T.Text
, TournamentSolution -> SolutionFileCharacterization
submissionScore :: SolutionFileCharacterization
}
deriving ((forall x. TournamentSolution -> Rep TournamentSolution x)
-> (forall x. Rep TournamentSolution x -> TournamentSolution)
-> Generic TournamentSolution
forall x. Rep TournamentSolution x -> TournamentSolution
forall x. TournamentSolution -> Rep TournamentSolution x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TournamentSolution -> Rep TournamentSolution x
from :: forall x. TournamentSolution -> Rep TournamentSolution x
$cto :: forall x. Rep TournamentSolution x -> TournamentSolution
to :: forall x. Rep TournamentSolution x -> TournamentSolution
Generic, [TournamentSolution] -> Value
[TournamentSolution] -> Encoding
TournamentSolution -> Bool
TournamentSolution -> Value
TournamentSolution -> Encoding
(TournamentSolution -> Value)
-> (TournamentSolution -> Encoding)
-> ([TournamentSolution] -> Value)
-> ([TournamentSolution] -> Encoding)
-> (TournamentSolution -> Bool)
-> ToJSON TournamentSolution
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: TournamentSolution -> Value
toJSON :: TournamentSolution -> Value
$ctoEncoding :: TournamentSolution -> Encoding
toEncoding :: TournamentSolution -> Encoding
$ctoJSONList :: [TournamentSolution] -> Value
toJSONList :: [TournamentSolution] -> Value
$ctoEncodingList :: [TournamentSolution] -> Encoding
toEncodingList :: [TournamentSolution] -> Encoding
$comitField :: TournamentSolution -> Bool
omitField :: TournamentSolution -> Bool
ToJSON)
data GameWithSolutions = GameWithSolutions
{ GameWithSolutions -> TournamentGame
theGame :: TournamentGame
, GameWithSolutions -> [TournamentSolution]
theSolutions :: [TournamentSolution]
}
deriving ((forall x. GameWithSolutions -> Rep GameWithSolutions x)
-> (forall x. Rep GameWithSolutions x -> GameWithSolutions)
-> Generic GameWithSolutions
forall x. Rep GameWithSolutions x -> GameWithSolutions
forall x. GameWithSolutions -> Rep GameWithSolutions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. GameWithSolutions -> Rep GameWithSolutions x
from :: forall x. GameWithSolutions -> Rep GameWithSolutions x
$cto :: forall x. Rep GameWithSolutions x -> GameWithSolutions
to :: forall x. Rep GameWithSolutions x -> GameWithSolutions
Generic, [GameWithSolutions] -> Value
[GameWithSolutions] -> Encoding
GameWithSolutions -> Bool
GameWithSolutions -> Value
GameWithSolutions -> Encoding
(GameWithSolutions -> Value)
-> (GameWithSolutions -> Encoding)
-> ([GameWithSolutions] -> Value)
-> ([GameWithSolutions] -> Encoding)
-> (GameWithSolutions -> Bool)
-> ToJSON GameWithSolutions
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: GameWithSolutions -> Value
toJSON :: GameWithSolutions -> Value
$ctoEncoding :: GameWithSolutions -> Encoding
toEncoding :: GameWithSolutions -> Encoding
$ctoJSONList :: [GameWithSolutions] -> Value
toJSONList :: [GameWithSolutions] -> Value
$ctoEncodingList :: [GameWithSolutions] -> Encoding
toEncodingList :: [GameWithSolutions] -> Encoding
$comitField :: GameWithSolutions -> Bool
omitField :: GameWithSolutions -> Bool
ToJSON)
data AssociatedSolutionCharacterization = AssociatedSolutionCharacterization
{ AssociatedSolutionCharacterization -> Sha1
forScenario :: Sha1
, AssociatedSolutionCharacterization -> SolutionCharacterization
characterization :: SolutionCharacterization
}
data SolutionCharacterization = SolutionCharacterization
{ SolutionCharacterization -> Seconds
solutionWallTime :: Seconds
, SolutionCharacterization -> TickNumber
solutionTicks :: TickNumber
, SolutionCharacterization -> Int
scenarioSeed :: Seed
, SolutionCharacterization -> ScenarioCodeMetrics
solutionCodeMetrics :: ScenarioCodeMetrics
}
deriving ((forall x.
SolutionCharacterization -> Rep SolutionCharacterization x)
-> (forall x.
Rep SolutionCharacterization x -> SolutionCharacterization)
-> Generic SolutionCharacterization
forall x.
Rep SolutionCharacterization x -> SolutionCharacterization
forall x.
SolutionCharacterization -> Rep SolutionCharacterization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SolutionCharacterization -> Rep SolutionCharacterization x
from :: forall x.
SolutionCharacterization -> Rep SolutionCharacterization x
$cto :: forall x.
Rep SolutionCharacterization x -> SolutionCharacterization
to :: forall x.
Rep SolutionCharacterization x -> SolutionCharacterization
Generic, [SolutionCharacterization] -> Value
[SolutionCharacterization] -> Encoding
SolutionCharacterization -> Bool
SolutionCharacterization -> Value
SolutionCharacterization -> Encoding
(SolutionCharacterization -> Value)
-> (SolutionCharacterization -> Encoding)
-> ([SolutionCharacterization] -> Value)
-> ([SolutionCharacterization] -> Encoding)
-> (SolutionCharacterization -> Bool)
-> ToJSON SolutionCharacterization
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: SolutionCharacterization -> Value
toJSON :: SolutionCharacterization -> Value
$ctoEncoding :: SolutionCharacterization -> Encoding
toEncoding :: SolutionCharacterization -> Encoding
$ctoJSONList :: [SolutionCharacterization] -> Value
toJSONList :: [SolutionCharacterization] -> Value
$ctoEncodingList :: [SolutionCharacterization] -> Encoding
toEncodingList :: [SolutionCharacterization] -> Encoding
$comitField :: SolutionCharacterization -> Bool
omitField :: SolutionCharacterization -> Bool
ToJSON)
data SolutionFileCharacterization = SolutionFileCharacterization
{ SolutionFileCharacterization -> Sha1
solutionHash :: Sha1
, SolutionFileCharacterization -> SolutionCharacterization
solutionCharacterization :: SolutionCharacterization
}
deriving ((forall x.
SolutionFileCharacterization -> Rep SolutionFileCharacterization x)
-> (forall x.
Rep SolutionFileCharacterization x -> SolutionFileCharacterization)
-> Generic SolutionFileCharacterization
forall x.
Rep SolutionFileCharacterization x -> SolutionFileCharacterization
forall x.
SolutionFileCharacterization -> Rep SolutionFileCharacterization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SolutionFileCharacterization -> Rep SolutionFileCharacterization x
from :: forall x.
SolutionFileCharacterization -> Rep SolutionFileCharacterization x
$cto :: forall x.
Rep SolutionFileCharacterization x -> SolutionFileCharacterization
to :: forall x.
Rep SolutionFileCharacterization x -> SolutionFileCharacterization
Generic, [SolutionFileCharacterization] -> Value
[SolutionFileCharacterization] -> Encoding
SolutionFileCharacterization -> Bool
SolutionFileCharacterization -> Value
SolutionFileCharacterization -> Encoding
(SolutionFileCharacterization -> Value)
-> (SolutionFileCharacterization -> Encoding)
-> ([SolutionFileCharacterization] -> Value)
-> ([SolutionFileCharacterization] -> Encoding)
-> (SolutionFileCharacterization -> Bool)
-> ToJSON SolutionFileCharacterization
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: SolutionFileCharacterization -> Value
toJSON :: SolutionFileCharacterization -> Value
$ctoEncoding :: SolutionFileCharacterization -> Encoding
toEncoding :: SolutionFileCharacterization -> Encoding
$ctoJSONList :: [SolutionFileCharacterization] -> Value
toJSONList :: [SolutionFileCharacterization] -> Value
$ctoEncodingList :: [SolutionFileCharacterization] -> Encoding
toEncodingList :: [SolutionFileCharacterization] -> Encoding
$comitField :: SolutionFileCharacterization -> Bool
omitField :: SolutionFileCharacterization -> Bool
ToJSON)
data ScenarioCharacterization = ScenarioCharacterization
{ ScenarioCharacterization -> FileMetadata
scenarioFileMetadata :: FileMetadata
, ScenarioCharacterization -> SolutionCharacterization
builtinSolution :: SolutionCharacterization
}
deriving ((forall x.
ScenarioCharacterization -> Rep ScenarioCharacterization x)
-> (forall x.
Rep ScenarioCharacterization x -> ScenarioCharacterization)
-> Generic ScenarioCharacterization
forall x.
Rep ScenarioCharacterization x -> ScenarioCharacterization
forall x.
ScenarioCharacterization -> Rep ScenarioCharacterization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
ScenarioCharacterization -> Rep ScenarioCharacterization x
from :: forall x.
ScenarioCharacterization -> Rep ScenarioCharacterization x
$cto :: forall x.
Rep ScenarioCharacterization x -> ScenarioCharacterization
to :: forall x.
Rep ScenarioCharacterization x -> ScenarioCharacterization
Generic, [ScenarioCharacterization] -> Value
[ScenarioCharacterization] -> Encoding
ScenarioCharacterization -> Bool
ScenarioCharacterization -> Value
ScenarioCharacterization -> Encoding
(ScenarioCharacterization -> Value)
-> (ScenarioCharacterization -> Encoding)
-> ([ScenarioCharacterization] -> Value)
-> ([ScenarioCharacterization] -> Encoding)
-> (ScenarioCharacterization -> Bool)
-> ToJSON ScenarioCharacterization
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: ScenarioCharacterization -> Value
toJSON :: ScenarioCharacterization -> Value
$ctoEncoding :: ScenarioCharacterization -> Encoding
toEncoding :: ScenarioCharacterization -> Encoding
$ctoJSONList :: [ScenarioCharacterization] -> Value
toJSONList :: [ScenarioCharacterization] -> Value
$ctoEncodingList :: [ScenarioCharacterization] -> Encoding
toEncodingList :: [ScenarioCharacterization] -> Encoding
$comitField :: ScenarioCharacterization -> Bool
omitField :: ScenarioCharacterization -> Bool
ToJSON)
instance FromHttpApiData Sha1 where
parseUrlPiece :: Text -> Either Text Sha1
parseUrlPiece = Sha1 -> Either Text Sha1
forall a. a -> Either Text a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sha1 -> Either Text Sha1)
-> (Text -> Sha1) -> Text -> Either Text Sha1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Sha1
Sha1 (String -> Sha1) -> (Text -> String) -> Text -> Sha1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
instance ToCapture (Capture "sha1" Sha1) where
toCapture :: Proxy (Capture "sha1" Sha1) -> DocCapture
toCapture Proxy (Capture "sha1" Sha1)
_ =
String -> String -> DocCapture
SD.DocCapture
String
"sha1"
String
"(text) scenario sha1"