{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleInstances #-} module Text.LambdaOptions.Keyword ( Keyword(..), ToKeyword(..), kw, argText, text, ) where import Data.Data import Data.String -------------------------------------------------------------------------------- -- | An option keyword, such as @"--help"@ data Keyword = Keyword { kwNames :: [String], -- ^ All the aliases for this keyword. kwArgText :: String, -- ^ Text to describe the arguments to the option given by this keyword. kwText :: String -- ^ Text to describe the function of the option given by this keyword. } deriving (Typeable, Data, Show, Eq, Ord) instance IsString Keyword where fromString name = kw [name] -- | Convenience 'Keyword' creation class. class ToKeyword a where toKeyword :: a -> Keyword -- | Identiy mapping. instance ToKeyword Keyword where toKeyword = id -- | Used to create a 'Keyword' with a single alias. instance ToKeyword String where toKeyword name = toKeyword [name] -- | Used to create a 'Keyword' with many (or no) aliases instance ToKeyword [String] where toKeyword names = Keyword { kwNames = names, kwArgText = "", kwText = "" } -- | Shorthand for 'toKeyword'. kw :: (ToKeyword a) => a -> Keyword kw = toKeyword -- | Sets the 'kwArgText' field in the keyword. Intended to be used infix: -- -- > kw "--directory" `argText` "DIR" `text` "Write files to DIR." argText :: Keyword -> String -> Keyword argText k s = k { kwArgText = s } -- | Sets the 'kwText' field in the keyword. Intended to be used infix. -- -- > kw "--quiet" `text` "Suppress message display." text :: Keyword -> String -> Keyword text k s = k { kwText = s }