diff --git a/Network/XMPP/Stream.hs b/Network/XMPP/Stream.hs index f4b7781..7adc5ac 100644 --- a/Network/XMPP/Stream.hs +++ b/Network/XMPP/Stream.hs @@ -458,6 +458,69 @@ messageTypeToString Normal = "normal" messageTypeToString (OtherMessageType s) = s +data Version = Version { majorVersion :: Integer + , minorVersion :: Integer } deriving (Eq) + + +-- Version numbers are displayed as ".". + +instance Show Version where + show (Version major minor) = (show major) ++ "." ++ (show minor) + + +-- If the major version numbers are the same, compare the minor versions. +-- Otherwise, compare the major version numbers. + +instance Ord Version where + compare (Version major aminor) (Version major bminor) = compare aminor bminor + compare (Version amajor _) (Version bmajor _) = compare amajor bmajor + + +-- Converts a "." numeric version number to a "Version" object. + +versionFromString :: String -> Maybe Version + +versionFromString s = case parse version "" (DBC.pack s) of + Right version -> Just version + Left _ -> Nothing + + +-- Constructs a "Version" based on the major and minor version numbers. + +versionFromNumbers :: Integer -> Integer -> Version + +versionFromNumbers major minor = Version major minor + + +languageTag :: GenParser Char st LangTag + +languageTag = do + + -- Read until we reach a '-' character, or EOF. This is the `primary tag'. + primTag <- tag + + -- Read zero or more subtags. + subTags <- subtags + eof + + return $ LangTag primTag subTags + where + + subtags :: GenParser Char st [String] + subtags = many $ do + char '-' + subtag <- tag + return subtag + + tag :: GenParser Char st String + tag = do + a <- many1 $ oneOf tagChars + return a + + tagChars :: [Char] + tagChars = ['a'..'z'] ++ ['A'..'Z'] + + data LangTag = LangTag { primaryTag :: String , subtags :: [String] }