packages feed

hsimport-0.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 -> do
           let numDrops = HS.srcLine . HS.importLoc $ importDecl
               numTakes = max 0 (numDrops - 1)

           modifyImports importDecl (spec ^. sourceFile) (outputFile spec) numTakes numDrops

        AddImport importDecl -> do
           let numTakes = HS.srcLine . HS.importLoc $ importDecl
               numDrops = numTakes

           modifyImports importDecl (spec ^. sourceFile) (outputFile spec) numTakes numDrops

        NoImportChange
           | Just saveTo <- spec ^. saveToFile -> copyFile (spec ^. sourceFile) saveTo
           | otherwise                         -> return ()
   where
      modifyImports importDecl inputFile outputFile numTakes numDrops = do
         file <- TIO.readFile inputFile
         let importLine = HS.prettyPrint importDecl
             lines_     = lines . T.unpack $ file
             lines_'    = take numTakes lines_ ++ [importLine] ++ drop numDrops lines_
             file'      = T.pack . unlines $ lines_'

         TIO.writeFile outputFile file'

      outputFile spec
         | Just file <- spec ^. saveToFile = file
         | otherwise                       = spec ^. sourceFile