module Main(main) where import Lexer import Paren import Unlexer import Edit import Control.Monad.Extra import System.Directory.Extra import System.Process.Extra import System.FilePath import System.IO.Extra import System.Environment -- GHC calls me with: original input output -- Test calls me with: --test directory -- Users call me with: input main :: IO () main = do args <- getArgs case args of "--test":xs -> runTest $ xs ++ ["." | null xs] original:input:output:_ -> runConvert original input output input:output:_ -> runConvert input input output input:_ -> runConvert input input "-" [] -> putStrLn "record-dot-preprocess [FILE-TO-CONVERT]" runConvert :: FilePath -> FilePath -> FilePath -> IO () runConvert original input output = do res <- unlexer original . unparen . edit . paren . lexer <$> readFileUTF8' input if output == "-" then putStrLn res else writeFileUTF8 output res where paren = parenOn lexeme [("(",")"),("[","]"),("{","}")] runTest :: [FilePath] -> IO () runTest dirs = withTempDir $ \tdir -> do createDirectory $ tdir "Control" writeFile (tdir "Control/Lens.hs") "module Control.Lens(module X) where import Lens.Micro as X" forM_ dirs $ \dir -> do files <- ifM (doesDirectoryExist dir) (listFilesRecursive dir) (return [dir]) forM_ files $ \file -> when (takeExtension file `elem` [".hs",".lhs"]) $ do let out = tdir takeFileName file runConvert file file out system_ $ "runhaskell -i" ++ tdir ++ " \"" ++ out ++ "\""