+-- | Parameter type.
+data OptCompletion = OptComplNone -- ^ No parameter to this option
+ | OptComplFile -- ^ An existing file
+ | OptComplDir -- ^ An existing directory
+ | OptComplHost -- ^ Host name
+ | OptComplInetAddr -- ^ One ipv4\/ipv6 address
+ | OptComplOneNode -- ^ One node
+ | OptComplManyNodes -- ^ Many nodes, comma-sep
+ | OptComplOneInstance -- ^ One instance
+ | OptComplManyInstances -- ^ Many instances, comma-sep
+ | OptComplOneOs -- ^ One OS name
+ | OptComplOneIallocator -- ^ One iallocator
+ | OptComplInstAddNodes -- ^ Either one or two nodes
+ | OptComplOneGroup -- ^ One group
+ | OptComplInteger -- ^ Integer values
+ | OptComplFloat -- ^ Float values
+ | OptComplJobId -- ^ Job Id
+ | OptComplCommand -- ^ Command (executable)
+ | OptComplString -- ^ Arbitrary string
+ | OptComplChoices [String] -- ^ List of string choices
+ | OptComplSuggest [String] -- ^ Suggested choices
+ deriving (Show, Read, Eq)
+
+-- | Argument type. This differs from (and wraps) an Option by the
+-- fact that it can (and usually does) support multiple repetitions of
+-- the same argument, via a min and max limit.
+data ArgCompletion = ArgCompletion OptCompletion Int (Maybe Int)
+ deriving (Show, Read, Eq)
+
+-- | Yes\/no choices completion.
+optComplYesNo :: OptCompletion
+optComplYesNo = OptComplChoices ["yes", "no"]
+
+-- | Text serialisation for 'OptCompletion', used on the Python side.
+complToText :: OptCompletion -> String
+complToText (OptComplChoices choices) = "choices=" ++ intercalate "," choices
+complToText (OptComplSuggest choices) = "suggest=" ++ intercalate "," choices
+complToText compl =
+ let show_compl = show compl
+ stripped = stripPrefix "OptCompl" show_compl
+ in map toLower $ fromMaybe show_compl stripped
+
+-- | Tex serialisation for 'ArgCompletion'.
+argComplToText :: ArgCompletion -> String
+argComplToText (ArgCompletion optc min_cnt max_cnt) =
+ complToText optc ++ " " ++ show min_cnt ++ " " ++ maybe "none" show max_cnt
+