{-# 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