Kaynağa Gözat

Messages from native to back can now be decoded with genericDecode

jherve 1 yıl önce
ebeveyn
işleme
9ec9dfba89

+ 9 - 5
native/src/job_search/messages.py

@@ -45,17 +45,21 @@ class BackgroundScriptMessage(Message):
 class NativeMessage(Message):
     def serialize(self):
         if isinstance(self, JobOfferListMessage):
-            tag = "job_offer_list"
+            tag = "NativeMessageJobOfferList"
+            values = asdict(self)
         elif isinstance(self, JobAddedMessage):
-            tag = "job_added"
+            tag = "NativeMessageJobAdded"
+            values = [asdict(self)]
         elif isinstance(self, JobAlreadyExistsMessage):
-            tag = "job_already_exists"
+            tag = "NativeMessageJobAlreadyExists"
+            values = [asdict(self)]
         elif isinstance(self, LogMessage):
-            tag = "log_message"
+            tag = "NativeMessageLog"
+            values = [asdict(self)]
         else:
             raise TypeError(f"No tag was associated to {type(self)} for serialization")
 
-        return asdict(self) | {"tag": tag}
+        return {"tag": tag, "values": values}
 
 
 @dataclass

+ 6 - 6
native/tests/test_read_write.py

@@ -130,27 +130,27 @@ class TestReadWriter:
         params=[
             (
                 JobOfferListMessage(job_offers=["job_offer_1", "job_offer_2"]),
-                {"tag": "job_offer_list", "job_offers": ["job_offer_1", "job_offer_2"]},
+                {"tag": "NativeMessageJobOfferList", "values": {"job_offers": ["job_offer_1", "job_offer_2"]}},
             ),
             (
                 JobAddedMessage(job="job"),
-                {"tag": "job_added", "job": "job"},
+                {"tag": "NativeMessageJobAdded", "values": [{"job": "job"}]},
             ),
             (
                 JobAlreadyExistsMessage(job_id="job_id"),
-                {"tag": "job_already_exists", "job_id": "job_id"},
+                {"tag": "NativeMessageJobAlreadyExists", "values": [{"job_id": "job_id"}]},
             ),
             (
                 LogMessage.debug(content="debug_content"),
-                {"tag": "log_message", "level": "debug", "content": "debug_content"},
+                {"tag": "NativeMessageLog", "values": [{"level": "debug", "content": "debug_content"}]},
             ),
             (
                 LogMessage.info(content={"message": "info"}),
-                {"tag": "log_message", "level": "info", "content": {"message": "info"}},
+                {"tag": "NativeMessageLog", "values": [{"level": "info", "content": {"message": "info"}}]},
             ),
             (
                 LogMessage.error(content="error_content"),
-                {"tag": "log_message", "level": "error", "content": "error_content"},
+                {"tag": "NativeMessageLog", "values": [{"level": "error", "content": "error_content"}]},
             ),
         ]
     )

+ 1 - 1
src/Background.purs

@@ -78,7 +78,7 @@ contentScriptMessageHandler _ m (MessageSender {tab, id}) = do
   debug msg
 
 nativeMessageHandler ∷ NativeMessage → Effect Unit
-nativeMessageHandler (NativeMessageJobOfferList {job_offers}) = do
+nativeMessageHandler (NativeMessageJobOfferList job_offers) = do
   clearAllJobs
   for_ job_offers \jo -> do
     storeJob jo

+ 1 - 1
src/NativeMessage.js

@@ -1,7 +1,7 @@
 export function toArrayOfObjects(field) {
     return function (obj) {
         return {
-            [field]: Object.entries(obj[field]).map(a => a[1]),
+            values: [Object.entries(obj.values[field]).map(a => a[1])],
             tag: obj.tag
         };
     }

+ 4 - 20
src/NativeMessage.purs

@@ -8,7 +8,7 @@ import Browser.WebExt.Port (Port, onDisconnectAddListener, onMessageAddListener)
 import Browser.WebExt.Port as Port
 import Browser.WebExt.Runtime (Application, connectNative)
 import Data.Argonaut.Core (Json)
-import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError(..), decodeJson, printJsonDecodeError)
+import Data.Argonaut.Decode (class DecodeJson, decodeJson, printJsonDecodeError)
 import Data.Argonaut.Decode.Generic (genericDecodeJson)
 import Data.Argonaut.Encode (class EncodeJson)
 import Data.Argonaut.Encode.Generic (genericEncodeJson)
@@ -36,7 +36,7 @@ data NativeMessage =
   }
   | NativeMessageJobAlreadyExists {job_id :: String}
   | NativeMessageJobAdded {job :: NativePythonJobOffer}
-  | NativeMessageJobOfferList {job_offers :: Array NativePythonJobOffer}
+  | NativeMessageJobOfferList (Array NativePythonJobOffer)
 
 type NativePythonJobOffer = {
   id :: String,
@@ -46,11 +46,6 @@ type NativePythonJobOffer = {
   application_rejection_date :: Maybe String
 }
 type NativePythonMessage m = {tag :: String | m}
-type NativePythonMessageLog = NativePythonMessage (level :: String, content :: String)
-type NativePythonMessageInitialConfiguration = NativePythonMessage (jobsPath :: String)
-type NativePythonMessageJobAlreadyExists = NativePythonMessage (job_id :: String)
-type NativePythonMessageJobOfferList = NativePythonMessage (job_offers :: Array NativePythonJobOffer)
-type NativePythonMessageJobAdded = NativePythonMessage (job :: NativePythonJobOffer)
 
 derive instance Generic NativeMessage _
 instance Show NativeMessage where show = genericShow
@@ -64,19 +59,8 @@ foreign import toArrayOfObjects :: String -> Json -> Json
 
 instance DecodeJson NativeMessage where
   decodeJson json = case decodeJson @(NativePythonMessage ()) json of
-    Right {tag: "log_message"} ->
-      map (\{level, content} -> NativeMessageLog {level, content}) $ decodeJson @NativePythonMessageLog json
-    Right {tag: "job_already_exists"} ->
-      map (\{job_id} -> NativeMessageJobAlreadyExists {job_id}) $ decodeJson @NativePythonMessageJobAlreadyExists json
-    Right {tag: "job_offer_list"} ->
-      map (\o -> NativeMessageJobOfferList {job_offers: o.job_offers}) $
-      decodeJson @NativePythonMessageJobOfferList $
-      toArrayOfObjects "job_offers" json
-    Right {tag: "job_added"} ->
-      map (\{job} -> NativeMessageJobAdded {job}) $ decodeJson @NativePythonMessageJobAdded json
-
-    Right _r -> Left $ UnexpectedValue json
-    Left _ -> genericDecodeJson json
+    Right {tag: "NativeMessageJobOfferList"} -> genericDecodeJson $ toArrayOfObjects "job_offers" json
+    _ -> genericDecodeJson json
 
 connectToNativeApplication ∷ Application → Effect Port
 connectToNativeApplication = connectNative