{-# LANGUAGE FlexibleContexts #-}
module Idris.Package.Parser where
import Idris.CmdOptions
import Idris.Imports
import Idris.Options (Opt)
import Idris.Package.Common
import Idris.Parser (moduleName)
import Idris.Parser.Helpers (Parser, Parsing, eol, iName, identifier,
identifierWithExtraChars, isEol, lchar,
packageName, parseErrorDoc, reserved, runparser,
someSpace, stringLiteral)
import Control.Applicative
import Control.Monad
import Control.Monad.State.Strict
import Data.List (union)
import qualified Options.Applicative as Opts
import System.Directory (doesFileExist)
import System.Exit
import System.FilePath (isValid, takeExtension, takeFileName)
import Text.Megaparsec ((<?>))
import qualified Text.Megaparsec as P
import qualified Text.PrettyPrint.ANSI.Leijen as PP
type PParser = Parser PkgDesc
parseDesc :: FilePath -> IO PkgDesc
parseDesc :: String -> IO PkgDesc
parseDesc String
fp = do
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (String -> String
takeExtension String
fp String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".ipkg") (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords [String
"The presented iPKG file does not have a '.ipkg' extension:", String -> String
forall a. Show a => a -> String
show String
fp]
ExitCode -> IO ()
forall a. ExitCode -> IO a
exitWith (Int -> ExitCode
ExitFailure Int
1)
Bool
res <- String -> IO Bool
doesFileExist String
fp
if Bool
res
then do
String
p <- String -> IO String
readFile String
fp
case Parser PkgDesc PkgDesc
-> PkgDesc -> String -> String -> Either ParseError PkgDesc
forall st res.
Parser st res -> st -> String -> String -> Either ParseError res
runparser Parser PkgDesc PkgDesc
pPkg PkgDesc
defaultPkg String
fp String
p of
Left ParseError
err -> String -> IO PkgDesc
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> Doc -> String
forall a b. (a -> b) -> a -> b
$ Doc -> Doc
PP.plain (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ ParseError -> Doc
parseErrorDoc ParseError
err)
Right PkgDesc
x -> PkgDesc -> IO PkgDesc
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return PkgDesc
x
else do
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords [ String
"The presented iPKG file does not exist:", String -> String
forall a. Show a => a -> String
show String
fp]
ExitCode -> IO PkgDesc
forall a. ExitCode -> IO a
exitWith (Int -> ExitCode
ExitFailure Int
1)
pPkg :: PParser PkgDesc
pPkg :: Parser PkgDesc PkgDesc
pPkg = do
String -> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall (m :: * -> *). Parsing m => String -> m ()
reserved String
"package"
PkgName
p <- PParser PkgName
pPkgName
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall (m :: * -> *). Parsing m => m ()
someSpace
(PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ())
-> (PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a b. (a -> b) -> a -> b
$ \PkgDesc
st -> PkgDesc
st { pkgname = p }
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) [()]
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some StateT PkgDesc (WriterT FC (Parsec Void String)) ()
pClause
PkgDesc
st <- Parser PkgDesc PkgDesc
forall s (m :: * -> *). MonadState s m => m s
get
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
P.eof
PkgDesc -> Parser PkgDesc PkgDesc
forall a. a -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (m :: * -> *) a. Monad m => a -> m a
return PkgDesc
st
pPkgName :: PParser PkgName
pPkgName :: PParser PkgName
pPkgName = ((String -> PParser PkgName)
-> (PkgName -> PParser PkgName)
-> Either String PkgName
-> PParser PkgName
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> PParser PkgName
forall a.
String -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail PkgName -> PParser PkgName
forall a. a -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String PkgName -> PParser PkgName)
-> (String -> Either String PkgName) -> String -> PParser PkgName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String PkgName
pkgName (String -> PParser PkgName)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> PParser PkgName
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
packageName) PParser PkgName -> String -> PParser PkgName
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"PkgName"
filename :: Parsing m => m String
filename :: forall (m :: * -> *). Parsing m => m String
filename = (do
String
filename <- m String
forall (m :: * -> *). Parsing m => m String
stringLiteral
m String -> m String -> m String
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Name -> String
forall a. Show a => a -> String
show (Name -> String) -> m Name -> m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String] -> m Name
forall (m :: * -> *). Parsing m => [String] -> m Name
iName []
case String -> Maybe String
filenameErrorMessage String
filename of
Just String
errorMessage -> String -> m String
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
errorMessage
Maybe String
Nothing -> String -> m String
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return String
filename)
m String -> String -> m String
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"filename"
where
filenameErrorMessage :: FilePath -> Maybe String
filenameErrorMessage :: String -> Maybe String
filenameErrorMessage String
path = (String -> Maybe String)
-> (() -> Maybe String) -> Either String () -> Maybe String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Maybe String
forall a. a -> Maybe a
Just (Maybe String -> () -> Maybe String
forall a b. a -> b -> a
const Maybe String
forall a. Maybe a
Nothing) (Either String () -> Maybe String)
-> Either String () -> Maybe String
forall a b. (a -> b) -> a -> b
$ do
String -> Either String ()
checkEmpty String
path
String -> Either String ()
checkValid String
path
String -> Either String ()
checkNoDirectoryComponent String
path
where
checkThat :: Bool -> a -> Either a ()
checkThat Bool
ok a
message =
if Bool
ok then () -> Either a ()
forall a b. b -> Either a b
Right () else a -> Either a ()
forall a b. a -> Either a b
Left a
message
checkEmpty :: String -> Either String ()
checkEmpty String
path =
Bool -> String -> Either String ()
forall {a}. Bool -> a -> Either a ()
checkThat (String
path String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"") String
"filename must not be empty"
checkValid :: String -> Either String ()
checkValid String
path =
Bool -> String -> Either String ()
forall {a}. Bool -> a -> Either a ()
checkThat (String -> Bool
System.FilePath.isValid String
path)
String
"filename must contain only valid characters"
checkNoDirectoryComponent :: String -> Either String ()
checkNoDirectoryComponent String
path =
Bool -> String -> Either String ()
forall {a}. Bool -> a -> Either a ()
checkThat (String
path String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String -> String
takeFileName String
path)
String
"filename must contain no directory component"
textUntilEol :: Parsing m => m String
textUntilEol :: forall (m :: * -> *). Parsing m => m String
textUntilEol = m Char -> m String
forall a. m a -> m [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ((Token String -> Bool) -> m (Token String)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
P.satisfy (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isEol)) m String -> m () -> m String
forall a b. m a -> m b -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* m ()
forall (m :: * -> *). Parsing m => m ()
eol m String -> m () -> m String
forall a b. m a -> m b -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* m ()
forall (m :: * -> *). Parsing m => m ()
someSpace
clause :: String -> PParser a -> (PkgDesc -> a -> PkgDesc) -> PParser ()
clause :: forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
name PParser a
p PkgDesc -> a -> PkgDesc
f = do a
value <- String -> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall (m :: * -> *). Parsing m => String -> m ()
reserved String
name StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) Char
-> StateT PkgDesc (WriterT FC (Parsec Void String)) Char
forall a b.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> StateT PkgDesc (WriterT FC (Parsec Void String)) Char
forall (m :: * -> *). Parsing m => Char -> m Char
lchar Char
'=' StateT PkgDesc (WriterT FC (Parsec Void String)) Char
-> PParser a -> PParser a
forall a b.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> PParser a
p PParser a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) () -> PParser a
forall a b.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall (m :: * -> *). Parsing m => m ()
someSpace
(PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ())
-> (PkgDesc -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a b. (a -> b) -> a -> b
$ \PkgDesc
st -> PkgDesc -> a -> PkgDesc
f PkgDesc
st a
value
commaSep :: Parsing m => m a -> m [a]
commaSep :: forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep m a
p = m a -> m Char -> m [a]
forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
P.sepBy1 m a
p (Char -> m Char
forall (m :: * -> *). Parsing m => Char -> m Char
lchar Char
',')
pOptions :: PParser [Opt]
pOptions :: PParser [Opt]
pOptions = do
String
str <- StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
stringLiteral
case [String] -> ParserResult [Opt]
execArgParserPure (String -> [String]
words String
str) of
Opts.Success [Opt]
a -> [Opt] -> PParser [Opt]
forall a. a -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (m :: * -> *) a. Monad m => a -> m a
return [Opt]
a
Opts.Failure ParserFailure ParserHelp
e -> String -> PParser [Opt]
forall a.
String -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> PParser [Opt]) -> String -> PParser [Opt]
forall a b. (a -> b) -> a -> b
$ (String, ExitCode) -> String
forall a b. (a, b) -> a
fst ((String, ExitCode) -> String) -> (String, ExitCode) -> String
forall a b. (a -> b) -> a -> b
$ ParserFailure ParserHelp -> String -> (String, ExitCode)
Opts.renderFailure ParserFailure ParserHelp
e String
""
ParserResult [Opt]
_ -> String -> PParser [Opt]
forall a.
String -> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Unexpected error"
libIdentifier :: Parsing m => m String
libIdentifier :: forall (m :: * -> *). Parsing m => m String
libIdentifier = String -> m String
forall (m :: * -> *). Parsing m => String -> m String
identifierWithExtraChars String
"_'-."
pClause :: PParser ()
pClause :: StateT PkgDesc (WriterT FC (Parsec Void String)) ()
pClause = String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"executable" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
filename (\PkgDesc
st String
v -> PkgDesc
st { execout = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser Name
-> (PkgDesc -> Name -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"main" ([String] -> PParser Name
forall (m :: * -> *). Parsing m => [String] -> m Name
iName []) (\PkgDesc
st Name
v -> PkgDesc
st { idris_main = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"sourcedir" (StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
identifier StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
stringLiteral) (\PkgDesc
st String
v -> PkgDesc
st { sourcedir = v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [Opt]
-> (PkgDesc -> [Opt] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"opts" PParser [Opt]
pOptions (\PkgDesc
st [Opt]
v -> PkgDesc
st { idris_opts = v ++ idris_opts st })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [PkgName]
-> (PkgDesc -> [PkgName] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"pkgs" (PParser PkgName -> PParser [PkgName]
forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep (PParser PkgName
pPkgName PParser PkgName
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> PParser PkgName
forall a b.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) b
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall (m :: * -> *). Parsing m => m ()
someSpace)) (\PkgDesc
st [PkgName]
ps ->
let pkgs :: [Opt]
pkgs = [String] -> [Opt]
pureArgParser ([String] -> [Opt]) -> [String] -> [Opt]
forall a b. (a -> b) -> a -> b
$ (PkgName -> [String]) -> [PkgName] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\PkgName
x -> [String
"-p", PkgName -> String
forall a. Show a => a -> String
show PkgName
x]) [PkgName]
ps
in PkgDesc
st { pkgdeps = ps `union` pkgdeps st
, idris_opts = pkgs ++ idris_opts st })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [Name]
-> (PkgDesc -> [Name] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"modules" (PParser Name -> PParser [Name]
forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep PParser Name
forall (m :: * -> *). Parsing m => m Name
moduleName) (\PkgDesc
st [Name]
v -> PkgDesc
st { modules = modules st ++ v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [String]
-> (PkgDesc -> [String] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"libs" (StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> PParser [String]
forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
libIdentifier) (\PkgDesc
st [String]
v -> PkgDesc
st { libdeps = libdeps st ++ v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [String]
-> (PkgDesc -> [String] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"objs" (StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> PParser [String]
forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
identifier) (\PkgDesc
st [String]
v -> PkgDesc
st { objs = objs st ++ v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser Name
-> (PkgDesc -> Name -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"makefile" ([String] -> PParser Name
forall (m :: * -> *). Parsing m => [String] -> m Name
iName []) (\PkgDesc
st Name
v -> PkgDesc
st { makefile = Just (show v) })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> PParser [Name]
-> (PkgDesc -> [Name] -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"tests" (PParser Name -> PParser [Name]
forall (m :: * -> *) a. Parsing m => m a -> m [a]
commaSep ([String] -> PParser Name
forall (m :: * -> *). Parsing m => [String] -> m Name
iName [])) (\PkgDesc
st [Name]
v -> PkgDesc
st { idris_tests = idris_tests st ++ v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"version" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgversion = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"readme" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgreadme = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"license" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkglicense = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"homepage" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkghomepage = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"sourceloc" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgsourceloc = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"bugtracker" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgbugtracker = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"brief" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
stringLiteral (\PkgDesc
st String
v -> PkgDesc
st { pkgbrief = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"author" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgauthor = Just v })
StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
-> StateT PkgDesc (WriterT FC (Parsec Void String)) a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String
-> StateT PkgDesc (WriterT FC (Parsec Void String)) String
-> (PkgDesc -> String -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
forall a.
String
-> PParser a
-> (PkgDesc -> a -> PkgDesc)
-> StateT PkgDesc (WriterT FC (Parsec Void String)) ()
clause String
"maintainer" StateT PkgDesc (WriterT FC (Parsec Void String)) String
forall (m :: * -> *). Parsing m => m String
textUntilEol (\PkgDesc
st String
v -> PkgDesc
st { pkgmaintainer = Just v })