Skip to content
Snippets Groups Projects
Commit a7e5467e authored by Jens Nolte's avatar Jens Nolte
Browse files

Parse bitfield attribute

parent f00d3ea4
No related branches found
No related tags found
No related merge requests found
...@@ -69,7 +69,8 @@ data ArgumentSpec = ArgumentSpec { ...@@ -69,7 +69,8 @@ data ArgumentSpec = ArgumentSpec {
data EnumSpec = EnumSpec { data EnumSpec = EnumSpec {
name :: String, name :: String,
description :: Maybe DescriptionSpec, description :: Maybe DescriptionSpec,
entries :: [EnumEntrySpec] entries :: [EnumEntrySpec],
isBitfield :: Bool
} }
deriving stock Show deriving stock Show
...@@ -567,7 +568,7 @@ parseInterface element = do ...@@ -567,7 +568,7 @@ parseInterface element = do
description <- findDescription element description <- findDescription element
requests <- mapM (parseRequest name) $ zip [0..] $ findChildren (qname "request") element requests <- mapM (parseRequest name) $ zip [0..] $ findChildren (qname "request") element
events <- mapM (parseEvent name) $ zip [0..] $ findChildren (qname "event") element events <- mapM (parseEvent name) $ zip [0..] $ findChildren (qname "event") element
enums <- mapM parseEnum $ findChildren (qname "enum") element enums <- mapM (parseEnum name) $ findChildren (qname "enum") element
pure InterfaceSpec { pure InterfaceSpec {
name, name,
version, version,
...@@ -671,15 +672,25 @@ parseArgument messageDescription (index, element) = do ...@@ -671,15 +672,25 @@ parseArgument messageDescription (index, element) = do
parseArgumentType x _ _ = fail $ "Argument type \"" <> x <> "\" should not have \"interface\" attribute" parseArgumentType x _ _ = fail $ "Argument type \"" <> x <> "\" should not have \"interface\" attribute"
parseEnum :: MonadFail m => Element -> m EnumSpec parseEnum :: MonadFail m => String -> Element -> m EnumSpec
parseEnum element = do parseEnum interface element = do
name <- getAttr "name" element name <- getAttr "name" element
description <- findDescription element description <- findDescription element
entries <- mapM parseEnumEntry $ findChildren (qname "entry") element entries <- mapM parseEnumEntry $ findChildren (qname "entry") element
let loc = interface <> "." <> name
isBitfield <- peekAttr "bitfield" element >>= \case
Just "true" -> pure True
Just "false" -> pure False
Just x -> fail $ "Invalid value for attribute \"bitfield\" on " <> loc <> ": " <> x
Nothing -> pure False
pure EnumSpec { pure EnumSpec {
name, name,
description, description,
entries entries,
isBitfield
} }
parseEnumEntry :: MonadFail m => Element -> m EnumEntrySpec parseEnumEntry :: MonadFail m => Element -> m EnumEntrySpec
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment