module Effects.Optparse
(
MonadOptparse (..),
OsPath,
osPath,
validOsPath,
)
where
import Control.Monad.Trans.Class (MonadTrans (lift))
import Control.Monad.Trans.Reader (ReaderT)
import FileSystem.OsPath (OsPath)
import FileSystem.OsPath qualified as FS.OsPath
import GHC.Stack (HasCallStack)
import Options.Applicative (ParserInfo, ParserPrefs, ParserResult, ReadM)
import Options.Applicative qualified as OA
class (Monad m) => MonadOptparse m where
execParser :: (HasCallStack) => ParserInfo a -> m a
customExecParser :: (HasCallStack) => ParserPrefs -> ParserInfo a -> m a
handleParseResult :: (HasCallStack) => ParserResult a -> m a
instance MonadOptparse IO where
execParser :: forall a. HasCallStack => ParserInfo a -> IO a
execParser = ParserInfo a -> IO a
forall a. ParserInfo a -> IO a
OA.execParser
{-# INLINEABLE execParser #-}
customExecParser :: forall a. HasCallStack => ParserPrefs -> ParserInfo a -> IO a
customExecParser = ParserPrefs -> ParserInfo a -> IO a
forall a. ParserPrefs -> ParserInfo a -> IO a
OA.customExecParser
{-# INLINEABLE customExecParser #-}
handleParseResult :: forall a. HasCallStack => ParserResult a -> IO a
handleParseResult = ParserResult a -> IO a
forall a. ParserResult a -> IO a
OA.handleParseResult
{-# INLINEABLE handleParseResult #-}
instance (MonadOptparse m) => MonadOptparse (ReaderT env m) where
execParser :: forall a. HasCallStack => ParserInfo a -> ReaderT env m a
execParser = m a -> ReaderT env m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT env m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT env m a)
-> (ParserInfo a -> m a) -> ParserInfo a -> ReaderT env m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserInfo a -> m a
forall a. HasCallStack => ParserInfo a -> m a
forall (m :: * -> *) a.
(MonadOptparse m, HasCallStack) =>
ParserInfo a -> m a
execParser
{-# INLINEABLE execParser #-}
customExecParser :: forall a.
HasCallStack =>
ParserPrefs -> ParserInfo a -> ReaderT env m a
customExecParser ParserPrefs
p = m a -> ReaderT env m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT env m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT env m a)
-> (ParserInfo a -> m a) -> ParserInfo a -> ReaderT env m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserPrefs -> ParserInfo a -> m a
forall a. HasCallStack => ParserPrefs -> ParserInfo a -> m a
forall (m :: * -> *) a.
(MonadOptparse m, HasCallStack) =>
ParserPrefs -> ParserInfo a -> m a
customExecParser ParserPrefs
p
{-# INLINEABLE customExecParser #-}
handleParseResult :: forall a. HasCallStack => ParserResult a -> ReaderT env m a
handleParseResult = m a -> ReaderT env m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT env m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT env m a)
-> (ParserResult a -> m a) -> ParserResult a -> ReaderT env m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserResult a -> m a
forall a. HasCallStack => ParserResult a -> m a
forall (m :: * -> *) a.
(MonadOptparse m, HasCallStack) =>
ParserResult a -> m a
handleParseResult
{-# INLINEABLE handleParseResult #-}
osPath :: ReadM OsPath
osPath :: ReadM OsPath
osPath = ReadM FilePath
forall s. IsString s => ReadM s
OA.str ReadM FilePath -> (FilePath -> ReadM OsPath) -> ReadM OsPath
forall a b. ReadM a -> (a -> ReadM b) -> ReadM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FilePath -> ReadM OsPath
forall (m :: * -> *).
(HasCallStack, MonadFail m) =>
FilePath -> m OsPath
FS.OsPath.encodeFail
validOsPath :: ReadM OsPath
validOsPath :: ReadM OsPath
validOsPath = ReadM FilePath
forall s. IsString s => ReadM s
OA.str ReadM FilePath -> (FilePath -> ReadM OsPath) -> ReadM OsPath
forall a b. ReadM a -> (a -> ReadM b) -> ReadM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FilePath -> ReadM OsPath
forall (m :: * -> *).
(HasCallStack, MonadFail m) =>
FilePath -> m OsPath
FS.OsPath.encodeValidFail