packages feed

stackage-curator-0.14.0: app/stackage-build-plan.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}
import           Data.Aeson                (toJSON)
import           Data.Aeson.Encode         (encodeToTextBuilder)
import qualified Data.Text                 as T
import qualified Data.Text.Lazy            as TL
import           Data.Text.Lazy.Builder    (toLazyText)
import qualified Data.Text.Lazy.IO         as TLIO
import           Options.Applicative
import           Paths_stackage_curator    (version)
import           Stackage.ShowBuildPlan
import           Stackage.CLI              (simpleOptions, simpleVersion)

main :: IO ()
main = do
    ((set, render, packages), ()) <- simpleOptions
        $(simpleVersion version)
        "Calculate and print (in different formats) Stackage build plans"
        "Calculate and print (in different formats) Stackage build plans"
        options
        empty
    tis <- getBuildPlan set $ map (mkPackageName . T.pack) packages
    TLIO.putStr $ render set tis
  where
    options = (,,)
        <$> setOptions
        <*> renderOptions
        <*> some (argument str (metavar "PACKAGES..."))

    mkSettings mmirror msnapshot mcommands =
          maybe id (setMirror . T.pack) mmirror
        $ maybe id setSnapshot msnapshot
        $ maybe id setShellCommands mcommands
        $ defaultSettings

    setOptions = mkSettings
        <$> ((fmap Just $ strOption
            ( long "mirror"
           <> help "Mirror to download packages from"
           <> metavar "URL"
            )) <|> pure Nothing)
        <*> ((fmap Just $ option readSnapshot
            ( long "snapshot"
           <> help "Which snapshot to pull the build plan from"
           <> metavar "SNAPSHOT"
            )) <|> pure Nothing)
        <*> ((fmap Just $ option readCommands
            ( long "commands"
           <> help "Shell commands do use: abstract, simple"
           <> metavar "COMMANDS"
            )) <|> pure Nothing)

    readSnapshot =
        str >>=
        either (fail . show) return . parseSnapshotSpec . T.pack

    readCommands = do
        s <- str
        case s of
            "abstract" -> return abstractCommands
            "simple" -> return simpleCommands
            _ -> fail $ "Invalid commands: " ++ s

    renderOptions =
        (option readRender
            ( long "format"
           <> help "Output format: shell, simple, json"
           <> metavar "FORMAT"
           ))

    readRender = do
        x <- str
        case x of
            "shell" -> return $ \set tis ->
                TL.fromStrict $ toShellScript set tis
            "simple" -> return $ \_set tis ->
                TL.fromStrict $ toSimpleText tis
            "json" -> return $ \_set tis ->
                toLazyText $ encodeToTextBuilder $ toJSON tis
            _ -> fail $ "Invalid renderer: " ++ x