1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
module Data.GI.GIR.Alias
( documentListAliases
) where
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Text.XML (Element(elementAttributes), Document(documentRoot))
import Data.GI.GIR.BasicTypes (Alias(..), Type(..), BasicType(..))
import Data.GI.GIR.Type (parseOptionalType)
import Data.GI.GIR.Parser
import Data.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 (Name 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 <- parseOptionalType
return (name, fromMaybe (TBasicType TPtr) 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)
|