packages feed

cab-0.2.2: src/Doc.hs

module Doc where

import Data.List (intercalate)
import System.Console.GetOpt (OptDescr(..), ArgDescr(..))

import Options
import Types

commandSpecByName :: String -> CommandDB -> Maybe CommandSpec
commandSpecByName _ [] = Nothing
commandSpecByName x (ent:ents)
    | x `elem` commandNames ent = Just ent
    | otherwise                 = commandSpecByName x ents

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

usageDocAlias :: CommandSpec -> (String, String, String)
usageDocAlias cmdspec = (usage,doc,alias)
  where
    usage = cmd ++ " " ++ showOptions ++ showArgs
    doc = document cmdspec
    alias = showAliases cmdspec
    cmd:_ = commandNames cmdspec
    options = opts cmdspec
    showOptions
      | null options = ""
      | otherwise    = "[" ++ intercalate "] [" (concatMap (masterOption optionDB) (opts cmdspec)) ++ "]"
    showArgs = maybe "" (" " ++) $ manual cmdspec
    opts = map fst . switches
    masterOption [] _ = []
    masterOption (spec:specs) o
      | fst spec == o = optionName spec : masterOption specs o
      | otherwise     = masterOption specs o
    showAliases = intercalate ", " . tail . commandNames

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

optionDoc :: OptionSpec -> (String, String)
optionDoc spec = (key,doc)
  where
    key = intercalate ", " . reverse . optionNames $ spec
    doc = optionDesc spec

optionName :: OptionSpec -> String
optionName (_,Option (c:_) _ (ReqArg _ arg) _) = '-':c:' ':arg
optionName (_,Option (c:_) _ _ _)              = '-':[c]
optionName _                                   = ""

optionNames :: OptionSpec -> [String]
optionNames (_,Option (c:_) (s:_) _ _) = ['-':[c],'-':'-':s]
optionNames _                          = []

optionDesc :: OptionSpec -> String
optionDesc (_,Option _ _ _ desc) = desc