packages feed

hfmt-0.0.1.0: app/Main.hs

module Main (main) where

import           Actions
import           Language.Haskell.Format
import           Language.Haskell.Format.Utilities  hiding (wasReformatted)
import           Language.Haskell.Source.Enumerator
import           OptionsParser                      as Options
import           Types

import           Control.Applicative
import           Control.Monad
import           Data.List
import           Data.Maybe
import           Data.Monoid
import           Options.Applicative.Extra          as OptApp
import           Pipes
import qualified Pipes.Prelude                      as P

main :: IO ()
main = do
  options <- execParser Options.parser
  formatter <- defaultFormatter
  runEffect $ inputFiles options >-> P.map (reformat formatter) >-> P.mapM_ (Actions.act options)

inputFiles :: Options -> Producer InputFileWithSource IO ()
inputFiles options = determineInputFilePaths (optPaths options) >-> P.mapM readInputFile
  where
    determineInputFilePaths :: [FilePath] -> Producer InputFile IO ()
    determineInputFilePaths [] = enumeratePath "." >-> P.map InputFilePath
    determineInputFilePaths ["-"] = yield InputFromStdIn
    determineInputFilePaths paths = for (each paths) enumeratePath >-> P.map InputFilePath

    readInputFile :: InputFile -> IO InputFileWithSource
    readInputFile (InputFilePath path) = InputFileWithSource (InputFilePath path) <$> readSource
                                                                                        path
    readInputFile (InputFromStdIn) = InputFileWithSource InputFromStdIn <$> readStdin

reformat :: Formatter -> InputFileWithSource -> ReformatResult
reformat (Formatter format) (InputFileWithSource input source) =
  case format source of
    Left error        -> InvalidReformat input error
    Right reformatted -> Reformat input source reformatted

readSource :: HaskellSourceFilePath -> IO HaskellSource
readSource path = HaskellSource <$> readFile path

readStdin :: IO HaskellSource
readStdin = HaskellSource <$> getContents