packages feed

horizon-gen-nix-0.6: src/Horizon/Gen/Nix.hs

{-# LANGUAGE RecordWildCards #-}
module Horizon.Gen.Nix (
    main
  , horizonGenNix
  , makeMakePackageSet
  , makeOverlay
  ) where

import qualified Data.Text               as T (unpack)
import           Dhall                   (auto, inputFile)
import           Distribution.Parsec     (eitherParsec)
import           Horizon.Gen.Nix.Options (HorizonOptions (MkHorizonOptions),
                                          fromInputFile, horizonGenNixOptsInfo,
                                          optInputFile)
import           Horizon.Gen.Nix.Writers (writeHaskellPackages,
                                          writeMakePackageSet, writeOverlay)
import           Horizon.Spec            (HorizonExport (MakeOverlay, MakePackageSet),
                                          OverlayExportSettings (MkOverlayExportSettings),
                                          PackageSetExportSettings (MkPackageSetExportSettings),
                                          compiler, fromCompiler, fromOverlay,
                                          packages)
import           Options.Applicative     (execParser)
import           Path                    (toFilePath)
import           Path.Dhall              ()


makeMakePackageSet :: PackageSetExportSettings -> IO ()
makeMakePackageSet (MkPackageSetExportSettings d f xs) = do
  case eitherParsec (T.unpack $ fromCompiler $ compiler xs) of
    Left e -> putStrLn e
    Right x -> do
      writeHaskellPackages d x (packages xs)
      writeMakePackageSet d f xs

makeOverlay :: OverlayExportSettings -> IO ()
makeOverlay (MkOverlayExportSettings d f xs) = let
  xs' = fromOverlay xs
  in
  case eitherParsec (T.unpack $ fromCompiler $ compiler xs') of
    Left e -> putStrLn e
    Right x -> do
      writeHaskellPackages d x (packages xs')
      writeOverlay d f xs

processHorizonExport :: HorizonExport -> IO ()
processHorizonExport (MakePackageSet settings) = makeMakePackageSet settings
processHorizonExport (MakeOverlay settings)    = makeOverlay settings

horizonGenNix :: HorizonOptions -> IO ()
horizonGenNix MkHorizonOptions{..} = do
  let fp = toFilePath . fromInputFile $ optInputFile
  x <- inputFile @HorizonExport auto fp
  processHorizonExport x

main :: IO ()
main = do
  x <- execParser horizonGenNixOptsInfo
  horizonGenNix x