packages feed

fquery-0.2.2: Adelie/QUse.hs

-- QUse.hs
--
-- Module to describe the use flags of an installed package.

module Adelie.QUse (qUse) where

import qualified Data.HashTable.IO as HT
import Control.Monad (unless)

import Adelie.Colour
import Adelie.ListEx
import Adelie.Portage
import Adelie.Pretty
import Adelie.Use
import Adelie.UseDesc

----------------------------------------------------------------

qUse :: [String] -> IO ()
qUse args = qUse' =<< findInstalledPackages args

qUse' :: [(String, String)] -> IO ()
qUse' [] = return ()
qUse' catnames = do
  useDesc' <- readUseDesc
  useDescPackage' <- readUseDescPackage min' max'
  useDescExpand'  <- readUseExpDesc
  mapM_ (use useDesc' useDescPackage' useDescExpand') catnames
  where min' = dropVersion $ fullnameFromCatName $ minimum catnames
        max' = dropVersion $ fullnameFromCatName $ maximum catnames

use :: UseDescriptions -> UseDescriptions -> UseDescriptions
    -> (String, String) -> IO ()
use useDesc' useDescPackage' useDescExpand' catname = do
  iUse <- readIUse fnIUse
  pUse <- readUse  fnPUse
  let iUse' = fmap stripUse iUse
      len   = maximum $ map length iUse'
  use' catname len useDesc' useDescPackage' useDescExpand' iUse' pUse
  where fnIUse = iUseFromCatName catname
        fnPUse = useFromCatName catname

use' :: (String, String) -> Int -> UseDescriptions -> UseDescriptions
     -> UseDescriptions -> [String] -> [String] -> IO ()
use' catname _ _ _ _ [] _ = putStr "No USE flags for " >> putCatNameLn catname
use' catname len useDesc' useDescPackage' useDescExpand' iUse pUse = do
  putStr "USE flags for " >> putCatNameLn catname
  mapM_ (format len useDesc' useDescPackage' useDescExpand' pUse) iUse
  putChar '\n'


-- |Strip prefixed '+' and '-' settings from a USE flag string.
stripUse :: String -> String
stripUse ('-':xs) = xs
stripUse ('+':xs) = xs
stripUse xs       = xs


----------------------------------------------------------------

format :: Int -> UseDescriptions -> UseDescriptions
       -> UseDescriptions -> [String] -> String -> IO ()

format len useDesc' useDescPackage' useDescExpand' pUse iUse =
  inst >> putStr (pad len ' ' iUse) >> off >> putStr " : " >> desc
  where
    inst = if iUse `elem` pUse
            then putStr " + " >> red
            else putStr "   " >> blue

    desc =
      desc' useDescExpand'    >>= \x -> unless x
        $ desc' useDescPackage' >>= \y -> unless y
          $ desc' useDesc'        >>= \z -> unless z
            $ putStrLn "<< no description >>"

    desc' descs = do
      r <- HT.lookup descs iUse
      case r of
        Just d  -> puts d >> return True
        Nothing -> return False

puts :: String -> IO ()
puts d@('!':'!':_) = red >> putStr d >> off2
puts d = putStrLn d