packages feed

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