summaryrefslogtreecommitdiff
path: root/src/message.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/message.ml')
-rw-r--r--src/message.ml45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/message.ml b/src/message.ml
index ec28922..673d5e8 100644
--- a/src/message.ml
+++ b/src/message.ml
@@ -1,12 +1,49 @@
exception Invalid_operation of string
+exception Invalid_message of string
-type operation = {
+type operation =
+ | Set of string list
+ | Delete of string list
+ | Show of (string list option) * ((string * string) list option)
+
+type message = {
+ session_id: string;
+ ops: operation list
+}
+
+type raw_operation = {
method_name: string;
path: string list option;
options: (string * string) list option
} [@@deriving yojson]
-type message = {
- session_id: string;
- ops: operation list;
+type raw_message = {
+ raw_session_id: string;
+ raw_ops: raw_operation list;
} [@@deriving yojson]
+
+
+let value_of_path p =
+ match p with
+ | Some p -> p
+ | None -> raise (Invalid_operation "Operation requires a path")
+
+let decode_operation op =
+ let op_name = op.method_name in
+ match op_name with
+ | "set" -> Set (value_of_path op.path)
+ | "delete" -> Delete (value_of_path op.path)
+ | "show" -> Show (op.path, op.options)
+ | _ -> raise (Invalid_operation "Invalid operation name")
+
+let decode_message msg =
+ let id = msg.raw_session_id in
+ let ops = List.map decode_operation msg.raw_ops in
+ {session_id = id; ops = ops}
+
+let decode j =
+ let msg = raw_message_of_yojson j in
+ match msg with
+ | `Ok msg -> decode_message msg
+ | `Error str -> raise (Invalid_message str)
+