unused-0.9.0.0: src/Unused/TermSearch/Internal.hs
module Unused.TermSearch.Internal
( commandLineOptions
, parseSearchResult
) where
import qualified Data.Char as C
import qualified Data.Maybe as M
import qualified Data.Text as T
import Unused.TermSearch.Types (SearchBackend(..))
import Unused.Types (SearchTerm(..), TermMatch(..))
import Unused.Util (stringToInt)
commandLineOptions :: SearchBackend -> String -> [String]
commandLineOptions backend t =
if regexSafeTerm t
then regexFlags backend t ++ baseFlags backend
else nonRegexFlags backend t ++ baseFlags backend
parseSearchResult :: SearchBackend -> SearchTerm -> String -> Maybe TermMatch
parseSearchResult backend term = maybeTermMatch backend . map T.unpack . T.splitOn ":" . T.pack
where
maybeTermMatch Rg [path, count] = Just $ toTermMatch term path $ countInt count
maybeTermMatch Rg _ = Nothing
maybeTermMatch Ag [_, path, count] = Just $ toTermMatch term path $ countInt count
maybeTermMatch Ag _ = Nothing
countInt = M.fromMaybe 0 . stringToInt
toTermMatch (OriginalTerm t) path = TermMatch t path Nothing
toTermMatch (AliasTerm t a) path = TermMatch t path (Just a)
regexSafeTerm :: String -> Bool
regexSafeTerm = all (\c -> C.isAlphaNum c || c == '_' || c == '-')
nonRegexFlags :: SearchBackend -> String -> [String]
nonRegexFlags Rg t = [t, ".", "-F"]
nonRegexFlags Ag t = [t, ".", "-Q"]
baseFlags :: SearchBackend -> [String]
baseFlags Rg = ["-c", "-j", "1"]
baseFlags Ag = ["-c", "--ackmate", "--ignore-dir", "tmp/unused"]
regexFlags :: SearchBackend -> String -> [String]
regexFlags _ t = ["(\\W|^)" ++ t ++ "(\\W|$)", "."]