32 lines
1.2 KiB
Haskell
32 lines
1.2 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Main (main) where
|
|
|
|
import qualified Data.Text.IO as TIO
|
|
import Roux.Parser (parseCookFile)
|
|
import System.Directory (listDirectory)
|
|
import System.Environment (getArgs)
|
|
import System.FilePath (takeExtension, (</>))
|
|
|
|
main :: IO ()
|
|
main = do
|
|
args <- getArgs
|
|
let recipeDir = case args of
|
|
(d : _) -> d
|
|
[] -> error "Usage: check-recipes <recipe-directory>"
|
|
entries <- listDirectory recipeDir
|
|
let cookFiles = filter ((== ".cook") . takeExtension) (map (recipeDir </>) entries)
|
|
putStrLn $ "Found " ++ show (length cookFiles) ++ " recipes in " ++ recipeDir
|
|
results <- mapM testParse cookFiles
|
|
let failures = [(name, err) | (name, Just err) <- results]
|
|
ok = length results - length failures
|
|
mapM_ (\(name, err) -> putStrLn $ "\n" ++ name ++ ":\n " ++ err) failures
|
|
putStrLn $ "\nOK: " ++ show ok ++ " / FAIL: " ++ show (length failures)
|
|
where
|
|
testParse fp = do
|
|
let name = reverse . takeWhile (/= '/') . reverse $ fp
|
|
content <- TIO.readFile fp
|
|
case parseCookFile content of
|
|
Left err -> pure (name, Just err)
|
|
Right _ -> pure (name, Nothing)
|