packages feed

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