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