module Option where import qualified Flatpak import qualified System.Path.PartClass as PathC import qualified System.Path as Path import qualified Shell.Utility.ParseArgument as ParseArg import qualified Options.Applicative as OP import Options.Applicative (help, metavar, argument, option, long, value, flag) import Control.Applicative (pure, (<*>)) import Data.Monoid ((<>)) data T = Cons { cabalInstall :: Bool, archs :: [Flatpak.Arch], projectDir :: Maybe Path.AbsRelDir, input, output :: Path.AbsRelFile } deriving (Show) path :: (PathC.FileDir fd) => OP.ReadM (Path.AbsRel fd) path = OP.eitherReader Path.parse arch :: OP.ReadM Flatpak.Arch arch = OP.eitherReader $ \str -> maybe (Left $ "unknown architecture: " ++ str) Right $ ParseArg.enumMaybe Flatpak.archString str parseFlags :: OP.Parser T parseFlags = pure Cons <*> flag False True (long "cabal-install" <> help "Build with one cabal-install (default: build module-wise using Cabal)") <*> OP.many (option arch (metavar "ARCH" <> long "arch" <> help "Architecture to build for")) <*> option (fmap Just path) (metavar "DIR" <> value Nothing <> long "directory" <> help "Cabal package directory (default: PWD)") <*> argument path (metavar "INPUT" <> help "base FlatPak manifest") <*> argument path (metavar "OUTPUT" <> help "full FlatPak manifest to generate") desc :: OP.InfoMod a desc = OP.fullDesc <> OP.progDesc "Generate a FlatPak manifest from a Cabal package description" info :: OP.ParserInfo T info = OP.info (OP.helper <*> parseFlags) desc