From 7fbb8071bf3e09dc0e3bf3f324ce0b6fe04c0288 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Tue, 21 Sep 2021 19:47:05 +0200
Subject: [PATCH] Add Requests and Events type to IsInterface

---
 src/Quasar/Wayland/Protocol/Core.hs |  4 +++-
 src/Quasar/Wayland/Protocol/TH.hs   | 30 +++++++++++++++--------------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/Quasar/Wayland/Protocol/Core.hs b/src/Quasar/Wayland/Protocol/Core.hs
index 21f15b6..a00af4c 100644
--- a/src/Quasar/Wayland/Protocol/Core.hs
+++ b/src/Quasar/Wayland/Protocol/Core.hs
@@ -183,6 +183,8 @@ class (
     IsMessage (WireEvent i)
   )
   => IsInterface i where
+  type Requests i
+  type Events i
   type WireRequest i
   type WireEvent i
   type InterfaceName i :: Symbol
@@ -215,7 +217,7 @@ class (
     IsMessage (WireUp s i),
     IsMessage (WireDown s i)
   )
-  => IsInterfaceSide (s :: Side) i
+  => IsInterfaceSide (s :: Side) i where
 
 
 getWireDown :: forall s i. IsInterfaceSide s i => Object s i -> Opcode -> Get (ProtocolM s (WireDown s i))
diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs
index 8388a24..e6d7618 100644
--- a/src/Quasar/Wayland/Protocol/TH.hs
+++ b/src/Quasar/Wayland/Protocol/TH.hs
@@ -108,13 +108,15 @@ interfaceDecs interface = do
     iName = interfaceN interface
     iT = interfaceT interface
     instanceDecs = [
-      tySynInstD (tySynEqn Nothing (appT (conT ''WireRequest) iT) rT),
+      tySynInstD (tySynEqn Nothing (appT (conT ''Requests) iT) (requestsT interface)),
+      tySynInstD (tySynEqn Nothing (appT (conT ''Events) iT) (eventsT interface)),
+      tySynInstD (tySynEqn Nothing (appT (conT ''WireRequest) iT) wireRequestT),
       tySynInstD (tySynEqn Nothing (appT (conT ''WireEvent) iT) eT),
       tySynInstD (tySynEqn Nothing (appT (conT ''InterfaceName) iT) (litT (strTyLit interface.name))),
       valD (varP 'interfaceName) (normalB (stringE interface.name)) []
       ]
-    rT :: Q Type
-    rT = if length interface.requests > 0 then conT rTypeName else [t|Void|]
+    wireRequestT :: Q Type
+    wireRequestT = if length interface.requests > 0 then conT rTypeName else [t|Void|]
     rTypeName :: Name
     rTypeName = mkName $ "WireRequest_" <> interface.name
     rConName :: RequestSpec -> Name
@@ -128,7 +130,7 @@ interfaceDecs interface = do
     requestContext :: RequestSpec -> MessageContext
     requestContext req@(RequestSpec msgSpec) = MessageContext {
       msgInterfaceT = iT,
-      msgT = rT,
+      msgT = wireRequestT,
       msgConName = rConName req,
       msgInterfaceSpec = interface,
       msgSpec = msgSpec
@@ -145,10 +147,10 @@ interfaceDecs interface = do
     eventContexts = eventContext <$> interface.events
 
     requestRecordD :: Q Dec
-    requestRecordD = messageRecordD (requestClassN interface) requestContexts
+    requestRecordD = messageRecordD (requestsName interface) requestContexts
 
     eventRecordD :: Q Dec
-    eventRecordD = messageRecordD (eventClassN interface) eventContexts
+    eventRecordD = messageRecordD (eventsName interface) eventContexts
 
 messageRecordD :: Name -> [MessageContext] -> Q Dec
 messageRecordD name messageContexts = dataD (cxt []) name [] Nothing [con] []
@@ -177,17 +179,17 @@ interfaceN interface = mkName $ "Interface_" <> interface.name
 interfaceT :: InterfaceSpec -> Q Type
 interfaceT interface = conT (interfaceN interface)
 
-requestClassN :: InterfaceSpec -> Name
-requestClassN interface = mkName $ "Requests_" <> interface.name
+requestsName :: InterfaceSpec -> Name
+requestsName interface = mkName $ "Requests_" <> interface.name
 
-requestClassT :: InterfaceSpec -> Q Type
-requestClassT interface = conT (requestClassN interface)
+requestsT :: InterfaceSpec -> Q Type
+requestsT interface = conT (requestsName interface)
 
-eventClassN :: InterfaceSpec -> Name
-eventClassN interface = mkName $ "Events_" <> interface.name
+eventsName :: InterfaceSpec -> Name
+eventsName interface = mkName $ "Events_" <> interface.name
 
-eventClassT :: InterfaceSpec -> Q Type
-eventClassT interface = conT (eventClassN interface)
+eventsT :: InterfaceSpec -> Q Type
+eventsT interface = conT (eventsName interface)
 
 
 
-- 
GitLab