diff --git a/src/Turtle.hs b/src/Turtle.hs index 6d9b0f7..5a0773d 100644 --- a/src/Turtle.hs +++ b/src/Turtle.hs @@ -67,6 +67,7 @@ module Turtle ( -- * Modules module Turtle.Format , module Turtle.Pattern + , module Turtle.Options , module Turtle.Shell , module Turtle.Prelude , module Control.Applicative @@ -88,6 +89,7 @@ module Turtle ( import Turtle.Format import Turtle.Pattern +import Turtle.Options import Turtle.Shell import Turtle.Prelude import Control.Applicative diff --git a/src/Turtle/Options.hs b/src/Turtle/Options.hs new file mode 100644 index 0000000..79626a7 --- /dev/null +++ b/src/Turtle/Options.hs @@ -0,0 +1,54 @@ +{-# LANGUAGE TypeFamilies #-} + +-- TODO: documentation + +module Turtle.Options + ( Opts.Parser + , Opts.InfoMod + , options + , opt + , flag + , metavar + , helpmsg + , shortname + , longname + ) where + +import Data.Text (Text) +import qualified Data.Text as Text +import Control.Applicative +import Control.Monad.IO.Class +import qualified Options.Applicative as Opts +import qualified Options.Applicative.Types as Opts +import qualified Options.Applicative.Builder.Internal as Opts + +options :: MonadIO io => Opts.Parser a -> Opts.InfoMod a -> io a +options parser info = liftIO + (Opts.execParser (Opts.info (Opts.helper <*> parser) info)) + +class Option opt where + type OptionFields opt :: * -> * + opt :: Opts.Mod (OptionFields opt) opt -> Opts.Parser opt + +instance Option Bool where + type OptionFields Bool = Opts.FlagFields + opt = Opts.switch + +instance Option Text where + type OptionFields Text = Opts.ArgumentFields + opt = Opts.argument (fmap Text.pack Opts.readerAsk) + +flag :: a -> a -> Opts.Mod Opts.FlagFields a -> Opts.Parser a +flag = Opts.flag + +metavar :: Opts.HasMetavar f => Text -> Opts.Mod f a +metavar str = Opts.metavar (Text.unpack str) + +helpmsg :: Text -> Opts.Mod f a +helpmsg str = Opts.help (Text.unpack str) + +shortname :: Opts.HasName f => Char -> Opts.Mod f a +shortname = Opts.short + +longname :: Opts.HasName f => Text -> Opts.Mod f a +longname str = Opts.long (Text.unpack str) diff --git a/turtle.cabal b/turtle.cabal index 02d1a17..6ea2c64 100644 --- a/turtle.cabal +++ b/turtle.cabal @@ -58,7 +58,8 @@ Library temporary < 1.3, text < 1.3, time < 1.6, - transformers >= 0.2.0.0 && < 0.5 + transformers >= 0.2.0.0 && < 0.5, + optparse-applicative >= 0.11 && < 0.12 if os(windows) Build-Depends: Win32 >= 2.2.0.1 && < 2.4 else @@ -68,6 +69,7 @@ Library Turtle.Format, Turtle.Pattern, Turtle.Shell, + Turtle.Options, Turtle.Prelude, Turtle.Tutorial GHC-Options: -O2 -Wall