packages feed

nix-tools-0.1.0.0: lts2nix/Main.hs

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Foldable (toList)
import System.Environment (getArgs)

import Data.Yaml (decodeFileEither)

import Nix.Pretty (prettyNix)
import Nix.Expr

import           Data.Aeson
import qualified Data.HashMap.Strict           as Map
import           Lens.Micro
import           Lens.Micro.Aeson

import           Cabal2Nix.Plan

main :: IO ()
main = getArgs >>= \case
  [file] -> do
    print . prettyNix =<< ltsPackages file
  _ -> putStrLn "call with /path/to/lts.yaml (Lts2Nix /path/to/lts-X.Y.yaml)"

ltsPackages :: FilePath -> IO NExpr
ltsPackages lts = do
  evalue <- decodeFileEither lts
  case evalue of
    Left  e     -> error (show e)
    Right value -> pure $ plan2nix $ lts2plan value

lts2plan :: Value -> Plan
lts2plan lts = Plan { packages , compilerVersion , compilerPackages }
 where
  packages = mappend compilerPackages' $ fmap Just $ lts ^. key "packages" . _Object <&> \v -> Package
    { packageVersion  = v ^. key "version" . _String
    , packageRevision = v ^? key "cabal-file-info" . key "hashes" . key "SHA256" . _String
    , packageFlags    = Map.mapMaybe (^? _Bool) $ v ^. key "constraints" . key "flags" . _Object
    }
  compilerVersion = lts ^. key "system-info" . key "ghc-version" . _String
  compilerPackages =
    (lts ^.  key "system-info" . key "core-packages" . _Object <&> (Just . (^. _String)))
    <> Map.fromList
           [ (p, Nothing) -- core-executables is just a list of
                                 -- exe names shipped with GHC, which
                                 -- lots of packages depend on
                                 -- (e.g. hsc2hs)
           | p <- toList $ lts ^. key "system-info" . key "core-executables" . _Array <&> (^. _String)
           ]
  compilerPackages' = fmap
    (fmap $ \v -> Package
      { packageVersion  = v
      , packageRevision = Nothing
      , packageFlags    = Map.empty
      }
    )
    compilerPackages