packages feed

record-dot-preprocessor-0.1: src/Main.hs

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 <any extra arguments>
-- 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 ++ "\""