From caf16546d799b65d697a931bd06291b83c6aaf63 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Fri, 10 Sep 2021 00:07:05 +0200
Subject: [PATCH] Implement message serialization

---
 src/Quasar/Wayland/Protocol/TH.hs | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs
index 6e51367..840ce05 100644
--- a/src/Quasar/Wayland/Protocol/TH.hs
+++ b/src/Quasar/Wayland/Protocol/TH.hs
@@ -182,7 +182,13 @@ isMessageInstanceD t msgs = instanceD (pure []) [t|IsMessage $t|] [opcodeNameD,
         getMessageE :: Q Exp
         getMessageE = applyA (conE (msg.msgConName)) ((\argT -> [|getArgument @($argT)|]) . argumentSpecType <$> msg.msgSpec.arguments)
     putMessageD :: Q Dec
-    putMessageD = funD 'putMessage [clause [] (normalB [|undefined|]) []]
+    putMessageD = funD 'putMessage (putMessageClauseD <$> msgs)
+    putMessageClauseD :: MessageContext -> Q Clause
+    putMessageClauseD msg = clause [msgConP msg] (normalB (putMessageE msg.msgSpec.arguments)) []
+      where
+        putMessageE :: [ArgumentSpec] -> Q Exp
+        putMessageE [] = [|pure ()|]
+        putMessageE args = doE ((\arg -> noBindS [|putArgument @($(argumentSpecType arg)) $(msgArgE msg arg)|]) <$> args)
 
 
 interfaceN :: InterfaceSpec -> Name
-- 
GitLab