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 :: ReadM a
proto = (String -> Either String a) -> ReadM a
forall a. (String -> Either String a) -> ReadM a
eitherReader (Text -> Either String a
forall msg. Message msg => Text -> Either String msg
readMessage (Text -> Either String a)
-> (String -> Text) -> String -> Either String a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
TL.pack)
protoOption :: Message a => Mod OptionFields a -> Parser a
protoOption :: Mod OptionFields a -> Parser a
protoOption = ReadM a -> Mod OptionFields a -> Parser a
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
forall a. Message a => ReadM a
proto
protoArgument :: Message a => Mod ArgumentFields a -> Parser a
protoArgument :: Mod ArgumentFields a -> Parser a
protoArgument = ReadM a -> Mod ArgumentFields a -> Parser a
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ReadM a
forall a. Message a => ReadM a
proto
maybeReader :: (String -> Maybe a) -> ReadM a
maybeReader :: (String -> Maybe a) -> ReadM a
maybeReader = (String -> Either String a) -> ReadM a
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String a) -> ReadM a)
-> ((String -> Maybe a) -> String -> Either String a)
-> (String -> Maybe a)
-> ReadM a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe a -> Either String a)
-> (String -> Maybe a) -> String -> Either String a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Either String a
-> (a -> Either String a) -> Maybe a -> Either String a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Either String a
forall a b. a -> Either a b
Left String
"No parse") a -> Either String a
forall a b. b -> Either a b
Right)
protoEnum :: MessageEnum a => ReadM a
protoEnum :: ReadM a
protoEnum = (String -> Maybe a) -> ReadM a
forall a. (String -> Maybe a) -> ReadM a
maybeReader String -> Maybe a
forall a. MessageEnum a => String -> Maybe a
readEnum ReadM a -> ReadM a -> ReadM a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> Maybe a) -> ReadM a
forall a. (String -> Maybe a) -> ReadM a
maybeReader (Int -> Maybe a
forall a. MessageEnum a => Int -> Maybe a
maybeToEnum (Int -> Maybe a) -> (String -> Maybe Int) -> String -> Maybe a
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe)
enumOption :: MessageEnum a => Mod OptionFields a -> Parser a
enumOption :: Mod OptionFields a -> Parser a
enumOption = ReadM a -> Mod OptionFields a -> Parser a
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
forall a. MessageEnum a => ReadM a
protoEnum
enumArgument :: MessageEnum a => Mod ArgumentFields a -> Parser a
enumArgument :: Mod ArgumentFields a -> Parser a
enumArgument = ReadM a -> Mod ArgumentFields a -> Parser a
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ReadM a
forall a. MessageEnum a => ReadM a
protoEnum