foliage/app/Foliage/Options.hs

160 lines
4.4 KiB
Haskell
Raw Normal View History

2022-09-19 16:33:50 +03:00
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
2022-03-11 11:10:49 +03:00
module Foliage.Options
( parseCommand,
Command (..),
BuildOptions (..),
2022-09-19 16:33:50 +03:00
SignOptions (..),
2022-05-19 10:01:57 +03:00
ImportIndexOptions (..),
ImportFilter (..),
2022-03-09 16:29:23 +03:00
)
where
2022-09-19 16:33:50 +03:00
import Development.Shake.Classes (Binary, Hashable, NFData)
import Foliage.Time
2022-09-19 16:33:50 +03:00
import GHC.Generics
2022-03-09 16:29:23 +03:00
import Options.Applicative
data Command
= CreateKeys FilePath
| Build BuildOptions
2022-05-19 10:01:57 +03:00
| ImportIndex ImportIndexOptions
parseCommand :: IO Command
parseCommand =
customExecParser
(prefs showHelpOnEmpty)
$ info
2022-03-09 16:29:23 +03:00
(optionsParser <**> helper)
( fullDesc
<> progDesc "foliage"
<> header "foliage - a builder for static Hackage repositories"
)
optionsParser :: Parser Command
2022-03-09 16:29:23 +03:00
optionsParser =
hsubparser $
command "create-keys" (info createKeysCommand (progDesc "Create TUF keys"))
<> command "build" (info buildCommand (progDesc "Build repository"))
2022-05-19 10:01:57 +03:00
<> command "import-index" (info importIndexCommand (progDesc "Import from Hackage index"))
2022-09-19 16:33:50 +03:00
data SignOptions
= SignOptsSignWithKeys FilePath
| SignOptsDon'tSign
deriving (Show, Eq, Generic)
deriving anyclass (Binary, Hashable, NFData)
2022-03-29 12:10:19 +03:00
data BuildOptions = BuildOptions
2022-09-19 16:33:50 +03:00
{ buildOptsSignOpts :: SignOptions,
2022-03-29 12:10:19 +03:00
buildOptsCurrentTime :: Maybe UTCTime,
buildOptsExpireSignaturesOn :: Maybe UTCTime,
2022-03-29 12:10:19 +03:00
buildOptsInputDir :: FilePath,
buildOptsOutputDir :: FilePath,
buildOptsNumThreads :: Int,
buildOptsWriteMetadata :: Bool
2022-03-29 12:10:19 +03:00
}
buildCommand :: Parser Command
buildCommand =
Build
<$> ( BuildOptions
2022-09-19 16:33:50 +03:00
<$> signOpts
<*> optional
( option
(maybeReader iso8601ParseM)
( long "current-time"
<> metavar "TIME"
<> help "Set current time"
<> showDefault
)
)
<*> optional
( option
(maybeReader iso8601ParseM)
( long "expire-signatures-on"
<> metavar "TIME"
<> help "Set an expiry date on TUF signatures"
)
)
2022-03-29 12:10:19 +03:00
<*> strOption
( long "input-directory"
<> metavar "INPUT"
<> help "Repository input directory"
<> showDefault
<> value "_sources"
)
<*> strOption
( long "output-directory"
2022-03-29 12:10:19 +03:00
<> metavar "OUTPUT"
<> help "Repository output directory"
<> showDefault
<> value "_repo"
)
<*> option
auto
( long "num-jobs"
<> short 'j'
<> metavar "JOBS"
<> help "Number of jobs to run in parallel, 0 is 'all available cores'"
<> showDefault
<> value 1
)
<*> switch
( long "write-metadata"
<> help "Write metadata in the output-directory"
<> showDefault
)
)
2022-09-19 16:33:50 +03:00
where
signOpts =
( SignOptsSignWithKeys
<$> strOption
( long "keys"
<> metavar "KEYS"
<> help "TUF keys location"
<> showDefault
<> value "_keys"
)
)
<|> ( SignOptsDon'tSign
<$ switch (long "no-signatures" <> help "Don't sign the repository")
)
createKeysCommand :: Parser Command
createKeysCommand =
CreateKeys
2022-03-09 16:29:23 +03:00
<$> strOption
( long "keys"
<> metavar "KEYS"
<> help "TUF keys location"
<> showDefault
<> value "_keys"
)
data ImportFilter = ImportFilter String (Maybe String)
2022-05-19 10:01:57 +03:00
newtype ImportIndexOptions = ImportIndexOptions
{ importOptsFilter :: Maybe ImportFilter
}
2022-05-19 10:01:57 +03:00
importIndexCommand :: Parser Command
importIndexCommand =
ImportIndex . ImportIndexOptions
<$> optional
( ImportFilter
<$> strOption
( long "package-name"
<> metavar "NAME"
<> help "package name"
)
<*> optional
( strOption
( long "package-version"
<> metavar "VERSION"
<> help "package version"
)
)
)