require-0.4.9: library/Require.hs
module Require where
import qualified Data.Text as Text
import Options.Generic
import Relude
import System.Directory
import qualified Require.Error as Error
import qualified Require.File as File
import Require.Transform
import Require.Types
data CommandArguments
= CommandArguments Text Text Text
deriving (Generic)
instance ParseRecord CommandArguments
findRequires :: IO (Maybe File.Name)
findRequires = do
currentDir <- getCurrentDirectory
files <- getDirectoryContents currentDir
let textFiles = fmap toText files
return $ File.Name . head <$> nonEmpty (filter (Text.isSuffixOf "Requires") textFiles)
requireMain :: IO ()
requireMain = do
CommandArguments inputFile _ outputFile <- getRecord "Require Haskell preprocessor" :: IO CommandArguments
requiresFile <- findRequires
run (AutorequireOnDirective requiresFile) (File.Name inputFile) (File.Name outputFile)
autorequireMain :: IO ()
autorequireMain = do
CommandArguments inputFile _ outputFile <- getRecord "Require Haskell preprocessor" :: IO CommandArguments
requiresFile <- findRequires
case requiresFile of
Nothing -> Error.die (File.Name inputFile) Error.MissingRequiresFile
Just fn -> run (AutorequireEnabled fn) (File.Name inputFile) (File.Name outputFile)
run :: AutorequireMode File.Name -> File.Name -> File.Name -> IO ()
run autoMode inputFile outputFile = do
input <- File.read inputFile
autoInput <- traverse File.read autoMode
case transform autoInput input of
Left err -> Error.die inputFile err
Right ls -> File.writeLines outputFile ls