packages feed

jenkinsPlugins2nix-0.2.0.0: app/Main.hs

{-# 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
        }