{-#LANGUAGE RecordWildCards #-}
module Main where
import System.Environment (getArgs)
import System.Console.GetOpt
import Data.List
import Control.Monad
import Filesystem.Path.CurrentOS hiding (concat, null)
import Data.Text as T hiding (foldl, concat, intercalate, null)
import Prelude hiding (FilePath)
import SOS
main :: IO ()
main = do
args <- getArgs
case getOpt Permute options args of
( [], _, []) -> error $ usageInfo header options
( opts, _, []) -> startWithOpts $ foldl (flip id) defaultOptions opts
( _, _, msgs) -> error $ concat msgs ++ usageInfo header options
data Options = Options { optShowVersion :: Bool
, optCommands :: [String]
, optPatterns :: [String]
, optDirectory :: FilePath
} deriving (Show, Eq)
defaultOptions :: Options
defaultOptions = Options { optShowVersion = False
, optCommands = []
, optPatterns = []
, optDirectory = fromText $ T.pack "."
}
options :: [OptDescr (Options -> Options)]
options = [ Option "v" ["version"]
(NoArg (\opts -> opts { optShowVersion = True }))
"show version info"
, Option "c" ["command"]
(ReqArg (\c opts -> opts { optCommands = optCommands opts ++ [c] }) "COMMAND")
"add command to run on file event"
, Option "p" ["pattern"]
(ReqArg (\e opts -> opts { optPatterns = optPatterns opts ++ [e] }) "PATTERN")
"add pattern to match on file path"
, Option "d" ["directory"]
(ReqArg (\d opts -> opts { optDirectory = decodeString d }) "DIRECTORY")
"set directory to watch for changes (default is ./)"
]
header :: String
header = "Usage: sos [v] -c command -p pattern"
version :: String
version = intercalate "\n" [ "\nSteel Overseer 0.2.0.0"
, " by Schell Scivally"
, ""
]
startWithOpts :: Options -> IO ()
startWithOpts opts = do
let Options{..} = opts
haveOptions = not (null optPatterns)
patternsValid = and $ fmap (not . null) optPatterns
when optShowVersion $ putStrLn version
unless patternsValid $ error "One or more patterns are empty."
when (haveOptions && patternsValid) $ steelOverseer optDirectory optCommands optPatterns