module Unused.CLI.Views.SearchResult.ListResult ( printList ) where import qualified Control.Monad as M import Data.List ((\\)) import qualified Data.List as L import Unused.CLI.Util import qualified Unused.CLI.Views.SearchResult.Internal as SR import qualified Unused.CLI.Views.SearchResult.Types as SR import Unused.Types (TermResults(..), GitContext(..), GitCommit(..), TermMatch(..), tmDisplayTerm, totalFileCount, totalOccurrenceCount) printList :: TermResults -> [TermMatch] -> SR.ResultsPrinter () printList r ms = SR.liftIO $ M.forM_ ms $ \m -> do printTermAndOccurrences r m printAliases r printFilePath m printSHAs r printRemovalReason r putStr "\n" printTermAndOccurrences :: TermResults -> TermMatch -> IO () printTermAndOccurrences r m = do setSGR [SetColor Foreground Dull (SR.termColor r)] setSGR [SetConsoleIntensity BoldIntensity] putStr " " setSGR [SetUnderlining SingleUnderline] putStr $ tmDisplayTerm m setSGR [Reset] setSGR [SetColor Foreground Vivid Cyan] setSGR [SetConsoleIntensity NormalIntensity] putStr " (" putStr $ pluralize (totalFileCount r) "file" "files" putStr ", " putStr $ pluralize (totalOccurrenceCount r) "occurrence" "occurrences" putStr ")" setSGR [Reset] putStr "\n" printAliases :: TermResults -> IO () printAliases r = M.when anyAliases $ do printHeader " Aliases: " putStrLn $ L.intercalate ", " remainingAliases where anyAliases = not $ null remainingAliases remainingAliases = trTerms r \\ [trTerm r] printFilePath :: TermMatch -> IO () printFilePath m = do printHeader " File Path: " setSGR [SetColor Foreground Dull Cyan] putStrLn $ tmPath m setSGR [Reset] printSHAs :: TermResults -> IO () printSHAs r = case mshas of Nothing -> M.void $ putStr "" Just shas' -> do printHeader " Recent SHAs: " putStrLn $ L.intercalate ", " shas' where mshas = (map gcSha . gcCommits) <$> trGitContext r printRemovalReason :: TermResults -> IO () printRemovalReason r = do printHeader " Reason: " putStrLn $ SR.removalReason r printHeader :: String -> IO () printHeader v = do setSGR [SetConsoleIntensity BoldIntensity] putStr v setSGR [SetConsoleIntensity NormalIntensity] pluralize :: Int -> String -> String -> String pluralize i@1 singular _ = show i ++ " " ++ singular pluralize i _ plural = show i ++ " " ++ plural