packages feed

autonix-deps-0.3.0.0: src/Autonix.hs

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

module Autonix (autonix) where

import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Control.Monad.State
import Data.Aeson.Encode.Pretty (encodePretty)
import qualified Data.ByteString.Lazy as BL
import Data.Map.Strict (Map)
import Data.Text (Text)
import Options.Applicative

import Autonix.Analyze
import Autonix.Package (Package)
import Autonix.Renames

autonix :: (MonadBaseControl IO m, MonadIO m, MonadThrow m)
        => [Analyzer (StateT (Map Text Package, Renames) m)]
        -> m ()
autonix analyzers = do
    (pkgs, renames) <- withArgs (analyzePackages (analyzeFiles analyzers))
    writePackages pkgs
    writeRenames renames

withArgs :: MonadIO m => (FilePath -> m a) -> m a
withArgs child =
    join $ liftIO $ execParser $ info (helper <*> parser) fullDesc
  where
    parser = child <$> strArgument (metavar "MANIFEST")

writePackages :: MonadIO m => Map Text Package -> m ()
writePackages = liftIO . BL.writeFile "packages.json" . encodePretty