haskell-gi-0.20.1: lib/Data/GI/GIR/Enum.hs
-- | Parsing of Enums.
module Data.GI.GIR.Enum
( Enumeration(..)
, EnumerationMember(..)
, parseEnum
) where
import Data.Int (Int64)
import Data.Text (Text)
import Foreign.C (CInt(..))
import Data.GI.GIR.Parser
import Data.GI.GIR.Type (parseCType)
data Enumeration = Enumeration {
enumMembers :: [EnumerationMember],
enumErrorDomain :: Maybe Text,
enumTypeInit :: Maybe Text,
enumDocumentation :: Documentation,
enumCType :: Text,
enumStorageBytes :: Int, -- ^ Bytes used for storage of this struct.
enumDeprecated :: Maybe DeprecationInfo }
deriving Show
-- | Member of an enumeration.
data EnumerationMember = EnumerationMember {
enumMemberName :: Text,
enumMemberValue :: Int64,
enumMemberCId :: Text,
enumMemberDoc :: Documentation
} deriving Show
-- | Parse a struct member.
parseEnumMember :: Parser EnumerationMember
parseEnumMember = do
name <- getAttr "name"
value <- getAttr "value" >>= parseIntegral
cid <- getAttrWithNamespace CGIRNS "identifier"
doc <- parseDocumentation
return $ EnumerationMember {
enumMemberName = name,
enumMemberValue = value,
enumMemberCId = cid,
enumMemberDoc = doc
}
foreign import ccall "_gi_get_enum_storage_bytes" get_storage_bytes ::
Int64 -> Int64 -> CInt
-- | Return the number of bytes that should be allocated for storage
-- of the given values in an enum.
extractEnumStorageBytes :: [Int64] -> Int
extractEnumStorageBytes values =
fromIntegral $ get_storage_bytes (minimum values) (maximum values)
-- | Parse an "enumeration" element from the GIR file.
parseEnum :: Parser (Name, Enumeration)
parseEnum = do
name <- parseName
ctype <- parseCType
doc <- parseDocumentation
deprecated <- parseDeprecation
errorDomain <- queryAttrWithNamespace GLibGIRNS "error-domain"
typeInit <- queryAttrWithNamespace GLibGIRNS "get-type"
members <- parseChildrenWithLocalName "member" parseEnumMember
return (name,
Enumeration {
enumMembers = members
, enumErrorDomain = errorDomain
, enumDocumentation = doc
, enumTypeInit = typeInit
, enumCType = ctype
, enumStorageBytes = extractEnumStorageBytes (map enumMemberValue members)
, enumDeprecated = deprecated
})