packages feed

dr-cabal-0.0.0.0: src/DrCabal/Cli.hs

{-# LANGUAGE ApplicativeDo #-}

{- |
Module                  : DrCabal.Cli
Copyright               : (c) 2022 Dmitrii Kovanikov
SPDX-License-Identifier : MPL-2.0
Maintainer              : Dmitrii Kovanikov <kovanikov@gmail.com>
Stability               : Experimental
Portability             : Portable

CLI parser for @dr-cabal@.
-}

module DrCabal.Cli
    ( Command (..)
    , readCommand

    , WatchArgs (..)
    , ProfileArgs (..)
    ) where

import qualified Options.Applicative as Opt

data Command
    = Watch WatchArgs
    | Profile ProfileArgs

newtype WatchArgs = WatchArgs
    { watchArgsOutput :: FilePath
    }

newtype ProfileArgs = ProfileArgs
    { profileArgsInput :: FilePath
    }

readCommand :: IO Command
readCommand = Opt.execParser opts
  where
    opts = Opt.info (Opt.helper <*> commandP) $ mconcat
      [ Opt.fullDesc
      , Opt.progDesc "Profile cabal dependency build output"
      , Opt.header "dr-cabal - a CLI tool to treat cabal output"
      ]

-- | All possible commands.
commandP :: Opt.Parser Command
commandP = Opt.subparser $ mconcat
    [ Opt.command "watch"
          $ Opt.info (Opt.helper <*> watchP)
          $ Opt.progDesc "Watch cabal output and save it"
    , Opt.command "profile"
          $ Opt.info (Opt.helper <*> profileP)
          $ Opt.progDesc "Output pretty cabal profile results"
    ]

watchP :: Opt.Parser Command
watchP = do
    watchArgsOutput <- Opt.strOption $ mconcat
        [ Opt.long "output"
        , Opt.short 'o'
        , Opt.metavar "FILE_PATH"
        , Opt.help "Save cabal output to a file in a JSON format"
        ]

    pure $ Watch WatchArgs{..}

profileP :: Opt.Parser Command
profileP = do
    profileArgsInput <-  Opt.strOption $ mconcat
        [ Opt.long "input"
        , Opt.short 'i'
        , Opt.metavar "FILE_PATH"
        , Opt.help "Read profile input from a JSON file, created by 'dr-cabal watch'"
        ]

    pure $ Profile ProfileArgs{..}