{-# LANGUAGE RecordWildCards, DeriveDataTypeable #-}
module Stack.Config.Nix
(nixOptsFromMonoid
,StackNixException(..)
) where
import Data.Text (pack)
import Data.Maybe
import Data.Typeable
import Path
import Stack.Types
import Control.Exception.Lifted
import Control.Monad.Catch (throwM,MonadCatch)
nixOptsFromMonoid :: (Monad m, MonadCatch m) => Maybe Project -> Path Abs Dir -> NixOptsMonoid -> m NixOpts
nixOptsFromMonoid mproject _stackRoot NixOptsMonoid{..} = do
let nixEnable = fromMaybe nixMonoidDefaultEnable nixMonoidEnable
nixPackages = case mproject of
Nothing -> nixMonoidPackages
Just p -> nixMonoidPackages ++ [case projectResolver p of
ResolverSnapshot (LTS x y) ->
pack ("haskell.packages.lts-" ++ show x ++ "_" ++ show y ++ ".ghc")
_ -> pack "ghc"]
nixInitFile = nixMonoidInitFile
nixShellOptions = nixMonoidShellOptions
if not (null nixMonoidPackages) && isJust nixInitFile then
throwM NixCannotUseShellFileAndPackagesException
else return ()
return NixOpts{..}
data StackNixException
= NixCannotUseShellFileAndPackagesException
deriving (Typeable)
instance Exception StackNixException
instance Show StackNixException where
show NixCannotUseShellFileAndPackagesException =
"You cannot have packages and a shell-file filled at the same time in your nix-shell configuration."