packages feed

autonix-deps-0.2.0.0: src/Autonix/Generate.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}

module Autonix.Generate (generateDeps, writeDeps, writeRenames) where

import Control.Lens
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Control.Monad.State
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as M
import Data.Monoid
import qualified Data.Set as S

import Autonix.Analyze
import Autonix.Args
import Autonix.Deps

generateDeps :: (MonadBaseControl IO m, MonadIO m, MonadThrow m)
             => [Analyzer (ResourceT (StateT Deps m))]
             -> StateT Deps m ()
generateDeps analyzers = do
    withArgs $ analyzePackages (analyzeFiles analyzers)
    get >>= writeDeps
    get >>= writeRenames

writeDeps :: MonadIO m => Deps -> m ()
writeDeps = liftIO . B.writeFile "dependencies.nix" . depsToNix

writeRenames :: MonadIO m => Deps -> m ()
writeRenames ds = liftIO $ do
  let renames = do
        (old, new) <- M.toList (ds^.names)
        return ("\"" <> old <> "\" = \"" <> new <> "\";")
  B.writeFile
    "renames.nix"
    (B.unlines
      ([ "# DO NOT EDIT! This file is generated automatically."
       , "{ }:"
       , "{"
       ]
       ++ renames ++
       [ "}" ]))

packageDeps :: (ByteString, PkgDeps) -> ByteString
packageDeps (name, ds) =
    B.unlines
    [ "  " <> name <> " = {"
    , "    buildInputs = [ "
      <> listInputs buildInputs
      <> " ];"
    , "    nativeBuildInputs = [ "
      <> listInputs nativeBuildInputs
      <> " ];"
    , "    propagatedBuildInputs = [ "
      <> listInputs propagatedBuildInputs
      <> " ];"
    , "    propagatedNativeBuildInputs = [ "
      <> listInputs propagatedNativeBuildInputs
      <> " ];"
    , "    propagatedUserEnvPkgs = [ "
      <> listInputs propagatedUserEnvPkgs
      <> " ];"
    , "  };"
    ]
  where
    listInputs l = B.unwords $ map quoted $ S.toList $ ds^.l
    quoted x = "\"" <> x <> "\""

depsToNix :: Deps -> ByteString
depsToNix (view deps -> ds) =
    B.unlines
    ( [ "# DO NOT EDIT! This file is generated automatically."
      , "{ }:"
      , "{"
      ]
      ++ map packageDeps (M.toList ds) ++
      [ "}" ]
    )