module System.Console.Docopt.QQ
(
docopt
, docoptFile
) where
import qualified Data.Map as M
import System.Console.Docopt.Types
import System.Console.Docopt.QQ.Instances ()
import System.Console.Docopt.ApplicativeParsec
import System.Console.Docopt.UsageParse
import Language.Haskell.TH
import Language.Haskell.TH.Quote
parseFmt :: FilePath -> String -> Either ParseError OptFormat
parseFmt = runParser pDocopt M.empty
docoptExp :: String -> Q Exp
docoptExp rawUsg = do
let usg = trimEmptyLines rawUsg
let mkDocopt fmt = Docopt { usage = usg, optFormat = fmt }
loc <- loc_filename <$> location
case mkDocopt <$> parseFmt loc usg of
Left err -> fail $ show err
Right parser -> [| parser |]
docopt :: QuasiQuoter
docopt = QuasiQuoter { quoteExp = docoptExp
, quoteDec = unsupported "Declaration"
, quotePat = unsupported "Pattern"
, quoteType = unsupported "Type"
}
where unsupported = fail . (++ " context unsupported")
docoptFile :: QuasiQuoter
docoptFile = quoteFile docopt