packages feed

shadower-0.1.0.3: src/Shadower.hs

{-# OPTIONS -Wall #-}
 
module Main where

import Filesystem.Path.CurrentOS (fromText, encodeString)
import Data.Text (pack)
import Data.String.Utils

import Control.Exception
import qualified Control.Exception as E

import System.FSNotify
import System.Environment
import System.Exit

import Test.DocTest

main :: IO ()
main = getArgs >>= getFilePathFromArgs >>= watchPath

getFilePathFromArgs :: [String] -> IO FilePath
getFilePathFromArgs (filePath:_) = return filePath
getFilePathFromArgs []       = return "."

watchPath :: FilePath -> IO ()
watchPath path = withManager $ \manager -> do
       _ <- watchTree manager (fromText $ pack path) (const True) handler
       _ <- getLine
       exitSuccess

handler :: Event -> IO()
handler action = case action of 
                 Modified file _ -> maybeRunDocTests (encodeString file)
                 _ -> return ()

maybeRunDocTests :: String -> IO ()
maybeRunDocTests file = case isHaskellSource file of 
                   True -> E.catch (runDocTests file) ignoreAllExceptions
                   _ -> return ()

ignoreAllExceptions :: SomeException -> IO ()
ignoreAllExceptions _ = return ()

runDocTests :: String -> IO ()
runDocTests file = do
              _ <- putStrLn $ "Running doctests in " ++ file
              doctest $
                  "-isrc"
                : [file]


isHaskellSource :: String -> Bool
isHaskellSource file = endswith ".hs" file || endswith ".lhs" file