{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import qualified Data.CaseInsensitive as CI
import Data.CaseInsensitive (CI)
import Data.Foldable (for_)
import qualified Data.Map as Map
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Data.Text (Text)
import Data.Traversable (for)
import Options.Applicative
import Copilot.Verifier (Verbosity(..))
import Copilot.Verifier.Examples (shouldFailExamples, shouldPassExamples)
newtype Options = Options
{ examples :: [CI Text]
} deriving Show
optsParser :: Parser Options
optsParser = Options
<$> (some . strArgument)
( metavar "EXAMPLE1 [EXAMPLE2 ...]"
<> help "The names of the examples to run" )
main :: IO ()
main = execParser opts >>= verifyExamples
where
opts = info (optsParser <**> helper)
( fullDesc
<> header "Run one or more copilot-verifier examples"
<> progDesc (unlines [ "Run one or more examples from the copilot-verifier/examples directory."
, "Each EXAMPLE must correspond to an example name."
]))
verifyExamples :: Options -> IO ()
verifyExamples Options{examples} = do
-- Check that all requested examples exist
examplesWithMain <- for examples $ \example ->
case Map.lookup example (shouldFailExamples Default `Map.union` shouldPassExamples Default) of
Just m -> pure (example, m)
Nothing -> fail $ "No example named " ++ Text.unpack (CI.original example)
-- Run the examples
for_ examplesWithMain $ \(example, exampleMain) -> do
Text.putStrLn "====="
Text.putStrLn $ "== Running the " <> CI.original example <> " example..."
Text.putStrLn "====="
Text.putStrLn ""
exampleMain
Text.putStrLn ""