libhbb-0.4.0.0: Language/Haskell/HBB/TestModes/ApplyTTree.hs
module Language.Haskell.HBB.TestModes.ApplyTTree (
ApplyTTreeArgs(..),
defaultApplyTTreeArgs,
testModeApplyTTree
) where
import Language.Haskell.HBB.Internal.TTreeColor
import Language.Haskell.HBB.Internal.TTreeJSON
import Language.Haskell.HBB.Internal.SrcSpan
import Language.Haskell.HBB.Internal.TTree
import qualified Data.ByteString.Char8 as StrictByteString
import System.Environment (getArgs)
import Data.Generics
import FastString (unpackFS,mkFastString)
import Data.List (sortBy,union)
import SrcLoc
-- | This type is used to have influence on the processing of
-- testModeApplyTTree. It is possible to activate ANSI color escape sequences
-- for the text or to enable the printing of the file context.
data ApplyTTreeArgs = ApplyTTreeArgs { applyToShowContext :: Bool
, applyToShowAnsiColored :: Bool }
-- | These are the default options used for this mode.
-- libhbb-cli only uses these default settings.
defaultApplyTTreeArgs :: ApplyTTreeArgs
defaultApplyTTreeArgs = ApplyTTreeArgs { applyToShowContext = False , applyToShowAnsiColored = False }
-- | This function reads a transformation-tree serialized to JSON from standard
-- input and applies it which means that it converts it to text. After having
-- it applied the text is returned as one single string.
testModeApplyTTree :: ApplyTTreeArgs -> IO String
testModeApplyTTree options = do
jsonString <- StrictByteString.getContents
case decodeTTreeFromJSON jsonString of
Left msg -> fail $ "Failure reading TTree from stdin: " ++ msg
Right tree -> applyTTree' options tree
-- | This is a helper function for testModeApplyTTree which does most of the
-- work.
applyTTree' :: ApplyTTreeArgs -> (RealSrcSpan,ClientTTree) -> IO String
applyTTree'
(ApplyTTreeArgs { applyToShowContext = sc , applyToShowAnsiColored = sa })
(spn,tree) = do
let occFile = unpackFS $ srcSpanFile spn
occFileContent <- readFile occFile
let affectedNames = [occFile] `union` collectFilenames (toBufSpan spn,tree)
fileCache <- cacheFiles affectedNames
let alteredContent = case sc of
True ->
let lns = lines occFileContent
in case sa of
True -> applyColoredTTree fileCache (toBufSpan spn,tree) lns
False -> applyTTree fileCache (toBufSpan spn,tree) lns
False -> case sa of
True -> applyColoredTTree fileCache (pointBufSpan 1 1,tree) [""]
False -> applyTTree fileCache (pointBufSpan 1 1,tree) [""]
return $ unlines alteredContent