{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} -- | -- Module : Main -- Copyright : (c) 2017 Mateusz Kowalczyk -- License : BSD3 -- -- @jenkinsPlugins2nix@ entry point. module Main (main) where import qualified Data.Bimap as Bimap import Data.List (intersperse) import Data.Monoid ((<>), mconcat) import qualified Data.Text as Text import Nix.JenkinsPlugins2Nix import Nix.JenkinsPlugins2Nix.Types import qualified Options.Applicative as Opt import System.Exit import System.IO import qualified Text.PrettyPrint.ANSI.Leijen as Pretty import Text.Printf (printf) main :: IO () main = do config <- Opt.execParser opts mkExprsFor config >>= \case Left err -> do hPutStrLn stderr err exitFailure Right p -> do Pretty.putDoc p exitSuccess where opts = Opt.info (parseConfig Opt.<**> Opt.helper) ( Opt.fullDesc <> Opt.progDesc "Generate nix expressions for requested Jenkins plugins." ) parseConfig :: Opt.Parser Config parseConfig = Config <$> Opt.option resolutionReader ( Opt.long "dependency-resolution" <> Opt.short 'r' <> Opt.help "Dependency resolution" <> Opt.showDefaultWith (resolutions Bimap.!) <> Opt.metavar (printf "[%s]" . mconcat . intersperse "|" $ Bimap.keysR resolutions) <> Opt.value Latest ) <*> Opt.some (Opt.option requestedPluginReader ( Opt.metavar "PLUGIN_NAME{:PLUGIN_VERSION}" <> Opt.long "plugin" <> Opt.short 'p' <> Opt.help "Plugins we should generate nix for. Latest version is used if not specified." ) ) where resolutions :: Bimap.Bimap ResolutionStrategy String resolutions = Bimap.fromList [(AsGiven, "as-given"), (Latest, "latest")] resolutionReader :: Opt.ReadM ResolutionStrategy resolutionReader = Opt.eitherReader $ \s -> case Bimap.lookupR s resolutions of Nothing -> Left $ "Invalid dependency resolution, needs to be one of " <> show (Bimap.keysR resolutions) Just v -> Right v requestedPluginReader :: Opt.ReadM RequestedPlugin requestedPluginReader = Opt.maybeReader $ \p -> Just $! case break (== ':') p of (n, ':' : ver) -> RequestedPlugin { requested_name = Text.pack n , requested_version = Just (Text.pack ver) } _ -> RequestedPlugin { requested_name = Text.pack p , requested_version = Nothing }