haskell-gi-0.8: src/GI/GIR/Alias.hs
module GI.GIR.Alias
( documentListAliases
) where
import qualified Data.Map as M
import Data.Text (Text)
import qualified Data.Text as T
import Text.XML (Element(elementAttributes), Document(documentRoot))
import GI.Type (Type)
import GI.GIR.BasicTypes (Alias(..))
import GI.GIR.Type (parseType)
import GI.GIR.Parser
import GI.GIR.XMLUtils (childElemsWithLocalName)
-- | Find all aliases in a given namespace.
namespaceListAliases :: Element -> M.Map Alias Type
namespaceListAliases ns =
case M.lookup "name" (elementAttributes ns) of
Nothing -> error $ "Namespace with no name!"
Just nsName -> case runParser nsName M.empty ns parseAliases of
Left err -> (error . T.unpack) err
Right aliases -> M.fromList (map addNS aliases)
where addNS (n, t) = (Alias (nsName, n), t)
-- | Parse all the aliases in the current namespace
parseAliases :: Parser [(Text, Type)]
parseAliases = parseChildrenWithLocalName "alias" parseAlias
-- | Parse a single alias
parseAlias :: Parser (Text, Type)
parseAlias = do
name <- getAttr "name"
t <- parseType
return (name, t)
-- | Find all aliases in a given document.
documentListAliases :: Document -> M.Map Alias Type
documentListAliases doc = M.unions (map namespaceListAliases namespaces)
where namespaces = childElemsWithLocalName "namespace" (documentRoot doc)