sphinxesc-0.1.0.1: src/Main.hs
{-# LANGUAGE OverloadedStrings, RecordWildCards, ScopedTypeVariables #-}
module Main where
import SphinxEscape (parseFilters, parseQueryNoFilters, extractFilters
,formatQueryNoEscaping, formatQuery, formatFilters
,transformQuery)
import System.Environment
import Data.List
import Options.Applicative
import Control.Applicative
import Data.Monoid((<>))
data Options = Options {
optMode :: Mode
, optInput :: Maybe String
}
data Mode = Convert | Parse | Extract | Transform deriving Read
mode :: Parser Options
mode = Options
<$> (read <$>
(strOption
(
(long "mode" <>
short 'm' <>
help "Mode [Convert | Parse | Extract | Transform]" <>
value "Convert")
))
)
<*> (
(Just <$> strArgument (metavar "RAW-STRING" <> help "sphinx raw input expression"))
<|> pure Nothing
)
opt :: ParserInfo Options
opt = info (helper <*> mode) (header "sphinxesc")
main = do
Options{..} <- execParser opt
input <- maybe getContents return optInput
let p = parseFilters input
(ts, as, qs) = extractFilters p
(tags, authors) = formatFilters ts as
q = formatQueryNoEscaping $ qs
p' = parseQueryNoFilters q
q' = formatQuery p'
case optMode of
Transform -> let (_, _, q) = transformQuery input in putStrLn q
Parse -> print p >> print p'
Extract -> putStrLn $ show $ (ts, as, qs)
Convert -> do
let indent = if null q' then "" else " "
tagsStr = show tags
authorsStr = show authors
output = if null q' && null tags && null authors
then ""
else q' ++ indent ++ tagsStr ++ authorsStr
putStrLn output