{-# LANGUAGE LambdaCase #-} module Main where import Control.Monad (join) import Data.Semigroup ((<>)) import Network.Distributed import Options.Applicative data Opts = Opts { waitNodes :: Int } optParser :: Parser Opts optParser = Opts <$> option auto (long "nodes" <> short 'n' <> help "How many nodes the Master should wait for before beginning build" <> showDefault <> value 1 <> metavar "INT") description :: InfoMod a description = fullDesc <> progDesc "stack-network interfaces with Stack to create a distributed version" <> header "stack-network" commands :: Parser (IO ()) commands = subparser $ buildCmd <> joinCmd buildCmd :: Mod CommandFields (IO ()) buildCmd = command "build" (info (runBuild <$> optParser) description) joinCmd :: Mod CommandFields (IO ()) joinCmd = command "join" (info (pure runJoin) description) runJoin :: IO () runJoin = runStackBuildT >> parseNetConfig >>= joinNetwork runBuild :: Opts -> IO () runBuild opts = runRequestNode (waitNodes opts) =<< parseNetConfig main :: IO () main = join $ execParser (info (commands <**> helper) description)