zifter-hindent-0.0.0.0: src/Zifter/Hindent.hs
module Zifter.Hindent where
import Control.Monad.IO.Class
import Data.Foldable
import Path
import Path.IO
import Safe
import System.Exit (ExitCode(..))
import qualified System.FilePath as FP (splitPath)
import System.IO
import System.Process
import Zifter.Zift
hindentZift :: Zift ()
hindentZift = do
() <- hindentCheckAndPrintVersion
rd <- getRootDir
fs <- liftIO $ snd <$> listDirRecur rd
let sources = filter (not . hidden) $ filter ((== ".hs") . fileExtension) fs
for_ sources hindentSingleSource
hindentCheckAndPrintVersion :: Zift ()
hindentCheckAndPrintVersion = do
let cmd = "hindent --version"
(_, mouth, _, ph) <-
liftIO $ createProcess ((shell cmd) {std_out = CreatePipe})
ec <- liftIO $ waitForProcess ph
case mouth of
Nothing -> pure ()
Just outh -> liftIO (hGetContents outh) >>= printZift
case ec of
ExitFailure c -> fail $ unwords [cmd, "failed with exit code", show c]
ExitSuccess -> pure ()
hindentSingleSource :: Path Abs File -> Zift ()
hindentSingleSource file = do
let cmd =
unwords
[ "hindent"
, "--indent-size"
, "4"
, "--line-length"
, "80"
, toFilePath file
]
let cp = shell cmd
ec <-
liftIO $ do
(_, _, _, ph) <- createProcess cp
waitForProcess ph
case ec of
ExitSuccess ->
printPreprocessingDone $
unwords
["Formatted Haskell source file with hindent:", toFilePath file]
ExitFailure c -> do
printPreprocessingError $
unwords
["Failed to format Haskell source file:", toFilePath file]
fail $ unwords [cmd, "failed", "with exit code", show c]
hidden :: Path Abs t -> Bool
hidden = any ((Just '.' ==) . headMay) . FP.splitPath . toFilePath