module Data.ProtoLens.Optparse
(
proto
, protoOption
, protoArgument
, protoEnum
, enumOption
, enumArgument
) where
import Control.Applicative ((<|>))
import Control.Monad ((<=<))
import Data.ProtoLens.Message (Message, MessageEnum(readEnum, maybeToEnum))
import Data.ProtoLens.TextFormat (readMessage)
import qualified Data.Text.Lazy as TL
import Options.Applicative
( ArgumentFields
, Mod
, ReadM
, OptionFields
, Parser
, argument
, eitherReader
, option
)
import Text.Read (readMaybe)
proto :: Message a => ReadM a
proto = eitherReader (readMessage . TL.pack)
protoOption :: Message a => Mod OptionFields a -> Parser a
protoOption = option proto
protoArgument :: Message a => Mod ArgumentFields a -> Parser a
protoArgument = argument proto
maybeReader :: (String -> Maybe a) -> ReadM a
maybeReader = eitherReader . fmap (maybe (Left "No parse") Right)
protoEnum :: MessageEnum a => ReadM a
protoEnum = maybeReader readEnum <|> maybeReader (maybeToEnum <=< readMaybe)
enumOption :: MessageEnum a => Mod OptionFields a -> Parser a
enumOption = option protoEnum
enumArgument :: MessageEnum a => Mod ArgumentFields a -> Parser a
enumArgument = argument protoEnum