packages feed

purenix-1.0: src/PureNix/Main.hs

{-# LANGUAGE NoImplicitPrelude #-}

module PureNix.Main where

import qualified Data.Aeson as Aeson
import Data.Aeson.Types (parseEither)
import Data.Foldable (toList)
import Data.List (intercalate)
import qualified Data.Text.Lazy.IO as TL
import qualified Language.PureScript.CoreFn as P
import Language.PureScript.CoreFn.FromJSON (moduleFromJSON)
import PureNix.Convert (ModuleInfo (ModuleInfo), convert)
import PureNix.Prelude
import PureNix.Print (renderExpr)
import qualified System.Directory as Dir
import qualified System.Exit as Sys
import System.FilePath ((</>))
import qualified System.FilePath as FP
import System.IO

defaultMain :: IO ()
defaultMain = do
  let workdir = "."
  let moduleRoot = workdir </> "output"
  moduleDirs <- filter (/= "cache-db.json") <$> Dir.listDirectory moduleRoot
  forM_ moduleDirs $ \rel -> do
    let dir = moduleRoot </> rel
    let file = dir </> "corefn.json"
    value <- Aeson.eitherDecodeFileStrict file >>= either Sys.die pure
    (_version, module') <- either Sys.die pure $ parseEither moduleFromJSON value
    let (nix, ModuleInfo usesFFI interpolations) = convert module'
    TL.writeFile (dir </> "default.nix") (renderExpr nix)
    let modulePath = P.modulePath module'
        foreignSrc = workdir </> FP.replaceExtension modulePath "nix"
        foreignTrg = dir </> "foreign.nix"
    hasForeign <- Dir.doesFileExist foreignSrc
    case (hasForeign, usesFFI) of
      (True, True) -> Dir.copyFile foreignSrc foreignTrg
      (True, False) -> hPutStrLn stderr $ "Warning: " <> modulePath <> " has an FFI file, but does not use FFI!"
      (False, True) -> hPutStrLn stderr $ "Warning: " <> modulePath <> " calls foreign functions, but has no associated FFI file!"
      (False, False) -> pure ()
    unless (null interpolations) $ do
      hPutStrLn stderr $
        unlines
          [ "Warning: " <> modulePath <> " appears to perform Nix string interpolation in the following locations:",
            "  " <> intercalate ", " (show <$> toList interpolations),
            "Nix string interpolations are currently not officially supported and may cause unexpected behavior."
          ]