update-nix-fetchgit-0.2.2: src/Update/Nix/FetchGit/Types.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Update.Nix.FetchGit.Types where
import Control.Monad.Reader
import Control.Monad.Validate
import Control.Monad.Validate.Internal
import Data.Bifunctor ( Bifunctor(first) )
import Data.Functor
import Data.Monoid
import Data.Text ( Text )
import Data.Time ( Day )
import Nix.Expr ( NExprLoc )
import Update.Nix.FetchGit.Warning
import Update.Span
type M = ReaderT Env (ValidateT (Dual [Warning]) IO)
runM :: Env -> M a -> IO ([Warning], Maybe a)
runM env = fmap (first (reverse . getDual)) . asWarnings . flip runReaderT env
-- | Runs a 'ValidateT' computation returning the errors raised by 'refute' or
-- 'dispute' if any, as well as returning the computation’s result if possible.
asWarnings :: (Functor m, Monoid e) => ValidateT e m a -> m (e, Maybe a)
asWarnings m = unValidateT MNothing m <&> \case
Left e -> (e, Nothing)
Right (MJust e , a) -> (e, Just a)
Right (MNothing, a) -> (mempty, Just a)
data Env = Env
{ sayLog :: Verbosity -> Text -> IO ()
, updateLocations :: [(Int, Int)]
}
data Verbosity
= Verbose
| Normal
| Quiet
newtype Updater = Updater
{ unUpdater :: M (Maybe Day, [SpanUpdate])
}
-- | A tree with a structure similar to the AST of the Nix file we are
-- parsing, but which only contains the information we care about.
data FetchTree
= Node { nodeVersionExpr :: Maybe NExprLoc
, nodeChildren :: [FetchTree]
}
| UpdaterNode Updater
-- | A repo is either specified by URL or by Github owner/repo.
data RepoLocation = URL Text
| GitHub { repoOwner :: Text
, repoRepo :: Text
}
| GitLab { repoOwner :: Text
, repoRepo :: Text
}
deriving Show