packages feed

jenga-0.1.0.0: main/jenga.hs

{-# LANGUAGE OverloadedStrings #-}

import           Control.Monad (unless)

import           Data.Either (partitionEithers)
import qualified Data.List as DL
import           Data.Text (Text)
import qualified Data.Text.IO as T

import           Jenga.Cabal
import           Jenga.HTTP
import           Jenga.PackageList
import           Jenga.Stack

import           System.IO (hPutStrLn, stderr)
import           System.Environment (getArgs)


main :: IO ()
main = do
  args <- getArgs
  case args of
    [cf] -> process cf
    _ -> usageExit


usageExit :: IO ()
usageExit =
  putStrLn $ "\nUsage: jenga <cabal file>\n"

process :: FilePath -> IO ()
process cabalFile = do
  deps <- fmap dependencyName <$> readPackageDependencies cabalFile
  mr <- readResolver
  case mr of
    Nothing -> putStrLn "Not able to find resolver version in 'stack.yaml' file."
    Just r -> processResolver deps r

processResolver :: [Text] -> StackResolver -> IO ()
processResolver deps sr = do
  mpl <- getStackageResolverPkgList sr
  case mpl of
    Left s -> putStrLn $ "Error parse JSON: " ++ s
    Right pl -> processPackageList deps pl


processPackageList :: [Text] -> PackageList -> IO ()
processPackageList deps plist = do
  let (missing, found) = partitionEithers $ lookupPackages plist deps
  unless (DL.null missing) $
    reportMissing missing
  printCabalFreeze found


reportMissing :: [Text] -> IO ()
reportMissing [] = putStrLn "No missing packages found."
reportMissing xs =
  hPutStrLn stderr $ "The packages " ++ show xs ++ " could not be found in the specified stack resolver data."

printCabalFreeze :: [(Text, PackageInfo)] -> IO ()
printCabalFreeze xs = do
  putStr "constraints:"
  T.putStrLn . mconcat . DL.intersperse ",\n" $ DL.map render xs
  where
    render (name, pkg) =
      mconcat [ " ", name, " == ", packageVersion pkg ]