houseman-0.1.0: app/Main.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Data.Maybe
import Data.Version (showVersion)
import Options.Generic
import System.Exit
import Text.Trifecta (parseFromFile)
import qualified Houseman
import qualified Paths_houseman
import qualified Procfile.Parse
import Procfile.Types
data Option = Start { filename :: Maybe FilePath <?> "Path of Procfile" } |
Run { command :: String <?> "Command to run"
, filename :: Maybe FilePath <?> "Path of Procfile"
} |
Version
deriving (Generic, Show)
instance ParseRecord Option
main :: IO ()
main = do
(opts :: Option) <- getRecord "Manage Procfile-based application"
case opts of
Start {filename} -> parseProcFile (fromMaybe "Procfile" (unHelpful filename))
>>= Houseman.start >>= exitWith
Run {filename,command} -> parseProcFile (fromMaybe "Procfile" (unHelpful filename))
>>= Houseman.run (unHelpful command) >>= exitWith
Version -> putStrLn (showVersion Paths_houseman.version)
parseProcFile :: FilePath -> IO Procfile
parseProcFile path = do
mProcfile <- parseFromFile Procfile.Parse.procfile path
case mProcfile of
Nothing -> exitWith (ExitFailure 1)
Just p -> return p