From a7e5467e5d8357451eeb36603e51ef928988bcaa Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sun, 24 Jul 2022 20:42:43 +0200 Subject: [PATCH] Parse bitfield attribute --- src/Quasar/Wayland/Protocol/TH.hs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs index f5766ee..9a53e0e 100644 --- a/src/Quasar/Wayland/Protocol/TH.hs +++ b/src/Quasar/Wayland/Protocol/TH.hs @@ -69,7 +69,8 @@ data ArgumentSpec = ArgumentSpec { data EnumSpec = EnumSpec { name :: String, description :: Maybe DescriptionSpec, - entries :: [EnumEntrySpec] + entries :: [EnumEntrySpec], + isBitfield :: Bool } deriving stock Show @@ -567,7 +568,7 @@ parseInterface element = do description <- findDescription element requests <- mapM (parseRequest name) $ zip [0..] $ findChildren (qname "request") 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 { name, version, @@ -671,15 +672,25 @@ parseArgument messageDescription (index, element) = do parseArgumentType x _ _ = fail $ "Argument type \"" <> x <> "\" should not have \"interface\" attribute" -parseEnum :: MonadFail m => Element -> m EnumSpec -parseEnum element = do +parseEnum :: MonadFail m => String -> Element -> m EnumSpec +parseEnum interface element = do name <- getAttr "name" element description <- findDescription 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 { name, description, - entries + entries, + isBitfield } parseEnumEntry :: MonadFail m => Element -> m EnumEntrySpec -- GitLab