packages feed

vampire-0.1.2.0: Main.hs

module Main where

import Debug.Vampire
import Options.Applicative
import Control.Applicative
import Control.Monad
import System.Directory
import System.IO
import System.Process
import System.Exit
import Paths_vampire

readFrom "-"  = getContents
readFrom file = readFile file
writeTo  "-"  = putStrLn
writeTo  file = writeFile file

doRewrite :: String -> String -> IO ()
doRewrite src dest = do
  code <- readFrom src
  case rewriteFile code of
    Just newCode -> writeTo dest newCode
    Nothing      -> putStrLn "could not parse input" >> exitFailure

doREPL :: String -> IO ()
doREPL mod = do
  script <- getDataFileName "vampire-repl"
  () <$ rawSystem "ghci" [mod, "-ghci-script", script]

doRewriteREPL :: String -> IO ()
doRewriteREPL src = do
  (dest, h) <- getTemporaryDirectory >>= flip openTempFile "Drained.hs"
  hClose h
  doRewrite src dest
  doREPL dest

-- parsers!

rewrite =
  liftA2 doRewrite
    (argument str $ metavar "SOURCE")
    (argument str $ metavar "DEST" <> value "-" <> showDefault)
rewriteDesc = "Rewrite a Haskell source file to add Vampire tracing."
repl =
  fmap doREPL
    (argument str $ metavar "MODULE")
replDesc = "Open a GHCi with a few custom commands onto a rewritten module."
reREPL =
  fmap doRewriteREPL
    (argument str $ metavar "SOURCE")
reREPLDesc =
  "Rewrite a Haskell source file to add Vampire tracing, then " ++
  "open a GHCi with a few custom commands onto the rewritten module."
 
vampire = subparser $
  (command "rewrite" $ info rewrite $ progDesc rewriteDesc) <>
  (command "repl"    $ info repl    $ progDesc replDesc)    <>
  (command "rerepl"  $ info reREPL  $ progDesc reREPLDesc)

main = join $ execParser $
  info (helper <*> vampire)
  (fullDesc <> header "vampire - eeevil expression tree analysis")