module Main where import Control.Exception import Control.Monad (when) import Control.Monad.Error hiding (mapM) import Control.Monad.Plus hiding (mapM) import Data.Semigroup hiding (Option) import Data.List (find) import Data.Maybe (fromMaybe, maybeToList) import Data.Traversable (mapM) import Data.Typeable import System.IO import System.Exit import System.Environment import System.Console.GetOpt import Text.Transf import Prelude hiding (readFile, writeFile) version = "transf-0.5" header = "Usage: transf [options]\n" ++ "Usage: transf [options] files...\n" ++ "\n" ++ "Options:" options = [ (Option ['h'] ["help"] (NoArg 1) "Print help and exit"), (Option ['v'] ["version"] (NoArg 2) "Print version and exit") ] main = do (opts, args, optErrs) <- getOpt Permute options `fmap` getArgs let usage = usageInfo header options let printUsage = putStr (usage ++ "\n") >> exitWith ExitSuccess let printVersion = putStr (version ++ "\n") >> exitWith ExitSuccess when (1 `elem` opts) printUsage when (2 `elem` opts) printVersion runFilter opts runFilter _ = transform stdin stdout transform fin fout = do res <- runTransf $ do input <- liftIO $ hGetContents fin output <- runTransformation (censorT <> printT <> evalT <> musicT) input liftIO $ hPutStr fout output case res of Left e -> putStrLn $ "Error: " ++ e Right _ -> return ()