hsimport-0.1.1: HsImport/Main.hs
{-# Language PatternGuards #-}
module HsImport.Main
( hsImport
) where
import Control.Lens
import System.Directory (copyFile)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import qualified Language.Haskell.Exts as HS
import HsImport.ImportChange
import HsImport.ImportSpec
hsImport :: ImportSpec -> IO ()
hsImport spec =
case importChange (spec ^. moduleToImport) (spec ^. symbolToImport) (spec ^. parsedSrcFile) of
ReplaceImport importDecl ->
modifyLines $ \lines_ ->
let importLine = HS.prettyPrint importDecl
numDrops = HS.srcLine . HS.importLoc $ importDecl
numTakes = max 0 (numDrops - 1)
in take numTakes lines_ ++ [importLine] ++ drop numDrops lines_
AddImport importDecl ->
modifyLines $ \lines_ ->
let importLine = HS.prettyPrint importDecl
numTakes = HS.srcLine . HS.importLoc $ importDecl
numDrops = numTakes
in take numTakes lines_ ++ [importLine] ++ drop numDrops lines_
AddImportAtEnd importDecl ->
modifyLines $ \lines_ ->
let importLine = HS.prettyPrint importDecl
in lines_ ++ [importLine]
NoImportChange
| Just saveTo <- spec ^. saveToFile -> copyFile (spec ^. sourceFile) saveTo
| otherwise -> return ()
where
modifyLines f = do
file <- TIO.readFile $ spec ^. sourceFile
let lines_ = lines . T.unpack $ file
lines_' = f lines_
file' = T.pack . unlines $ lines_'
TIO.writeFile (outputFile spec) file'
where
outputFile spec
| Just file <- spec ^. saveToFile = file
| otherwise = spec ^. sourceFile