@@ -10,6 +10,7 @@ module Idris.Package.Parser where
1010
1111import Idris.CmdOptions
1212import Idris.Imports
13+import Idris.Options (Opt)
1314import Idris.Package.Common
1415import Idris.Parser (moduleName)
1516import Idris.Parser.Helpers (Parser, Parsing, eol, iName, identifier, isEol,
@@ -19,6 +20,7 @@ import Idris.Parser.Helpers (Parser, Parsing, eol, iName, identifier, isEol,
1920import Control.Applicative
2021import Control.Monad.State.Strict
2122import Data.List (union)
23+import qualified Options.Applicative as Opts
2224import System.Directory (doesFileExist)
2325import System.Exit
2426import System.FilePath (isValid, takeExtension, takeFileName)
@@ -109,11 +111,19 @@ clause name p f = do value <- reserved name *> lchar '=' *> p <* someSpace
109111commaSep :: Parsing m => m a -> m [a]
110112commaSep p = P.sepBy1 p (lchar ',')
111113
114+pOptions :: PParser [Opt]
115+pOptions = do
116+ str <- stringLiteral
117+ case execArgParserPure (words str) of
118+ Opts.Success a -> return a
119+ Opts.Failure e -> fail $ fst $ Opts.renderFailure e ""
120+ _ -> fail "Unexpected error"
121+
112122pClause :: PParser ()
113123pClause = clause "executable" filename (\st v -> st { execout = Just v })
114124 <|> clause "main" (iName []) (\st v -> st { idris_main = Just v })
115125 <|> clause "sourcedir" identifier (\st v -> st { sourcedir = v })
116− <|> clause "opts" (pureArgParser . words <$> stringLiteral) (\st v -> st { idris_opts = v ++ idris_opts st })
126+ <|> clause "opts" pOptions (\st v -> st { idris_opts = v ++ idris_opts st })
117127 <|> clause "pkgs" (commaSep (pPkgName <* someSpace)) (\st ps ->
118128 let pkgs = pureArgParser $ concatMap (\x -> ["-p", show x]) ps
119129 in st { pkgdeps = ps `union` pkgdeps st