+3
-3
stack/zulip/examples/atom_feed_bot.ml
+3
-3
stack/zulip/examples/atom_feed_bot.ml
·········
·········
+1
-1
stack/zulip/examples/bot_example.ml
+1
-1
stack/zulip/examples/bot_example.ml
···Printf.printf "Note: This uses mock responses since we're not connected to a real Zulip server.\n"
···Printf.printf "Note: This uses mock responses since we're not connected to a real Zulip server.\n"
+11
-11
stack/zulip/examples/echo_bot.ml
+11
-11
stack/zulip/examples/echo_bot.ml
·····················
·····················
+3
-3
stack/zulip/examples/test_client.ml
+3
-3
stack/zulip/examples/test_client.ml
·········
·········
+2
-2
stack/zulip/examples/test_realtime_bot.ml
+2
-2
stack/zulip/examples/test_realtime_bot.ml
······
······
+3
-3
stack/zulip/lib/zulip/lib/auth.ml
+3
-3
stack/zulip/lib/zulip/lib/auth.ml
···-Error (Zerror.create ~code:(Other "parse_error") ~msg:("Error parsing zuliprc: " ^ Printexc.to_string exn) ())
···+Error (Zulip_types.create_error ~code:(Other "file_error") ~msg:("Cannot read zuliprc file: " ^ msg) ())+Error (Zulip_types.create_error ~code:(Other "parse_error") ~msg:("Error parsing zuliprc: " ^ Printexc.to_string exn) ())
+1
-1
stack/zulip/lib/zulip/lib/auth.mli
+1
-1
stack/zulip/lib/zulip/lib/auth.mli
+2
-2
stack/zulip/lib/zulip/lib/channel.ml
+2
-2
stack/zulip/lib/zulip/lib/channel.ml
···-Error (Zerror.create ~code:(Other "json_parse_error") ~msg:"Channel JSON must be an object" ())-Error (Zerror.create ~code:(Other "json_parse_error") ~msg:("Channel JSON parsing failed: " ^ Printexc.to_string exn) ())
···+Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:"Channel JSON must be an object" ())+Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:("Channel JSON parsing failed: " ^ Printexc.to_string exn) ())
+2
-2
stack/zulip/lib/zulip/lib/channel.mli
+2
-2
stack/zulip/lib/zulip/lib/channel.mli
+2
-2
stack/zulip/lib/zulip/lib/channels.ml
+2
-2
stack/zulip/lib/zulip/lib/channels.ml
···-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Invalid streams response format" ()))-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Streams response must be an object" ()))
···+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Invalid streams response format" ()))+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Streams response must be an object" ()))
+5
-5
stack/zulip/lib/zulip/lib/channels.mli
+5
-5
stack/zulip/lib/zulip/lib/channels.mli
···
···
+6
-6
stack/zulip/lib/zulip/lib/client.ml
+6
-6
stack/zulip/lib/zulip/lib/client.ml
···
···
+1
-1
stack/zulip/lib/zulip/lib/client.mli
+1
-1
stack/zulip/lib/zulip/lib/client.mli
+3
-3
stack/zulip/lib/zulip/lib/event.ml
+3
-3
stack/zulip/lib/zulip/lib/event.ml
······-Error (Zerror.create ~code:(Other "json_parse_error") ~msg:("Event JSON parsing failed: " ^ Printexc.to_string exn) ())
······+Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:"Event JSON must be an object" ())+Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:("Event JSON parsing failed: " ^ Printexc.to_string exn) ())
+2
-2
stack/zulip/lib/zulip/lib/event.mli
+2
-2
stack/zulip/lib/zulip/lib/event.mli
+5
-5
stack/zulip/lib/zulip/lib/event_queue.ml
+5
-5
stack/zulip/lib/zulip/lib/event_queue.ml
···-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Invalid register response: missing queue_id" ()))-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Register response must be an object" ()))···-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Events response must be an object" ()))
···+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Invalid register response: missing queue_id" ()))+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Register response must be an object" ()))···+Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Invalid events response format" ())+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Events response must be an object" ()))
+3
-3
stack/zulip/lib/zulip/lib/event_queue.mli
+3
-3
stack/zulip/lib/zulip/lib/event_queue.mli
···-val get_events : t -> Client.t -> ?last_event_id:int -> unit -> (Event.t list, Zerror.t) result
···+val get_events : t -> Client.t -> ?last_event_id:int -> unit -> (Event.t list, Zulip_types.zerror) result
+21
-23
stack/zulip/lib/zulip/lib/jsonu.ml
+21
-23
stack/zulip/lib/zulip/lib/jsonu.ml
···-| Some _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a string" key) ())-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a valid float" key) ()))-| Some _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a float" key) ())-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| Some _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a boolean" key) ())-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| Some _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not an object" key) ())-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| Some _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not an array" key) ())-| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···-| _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON object" context) ())···-| _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON array" context) ())···-Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" field) ()-Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' type mismatch: expected %s" field expected) ()-| Failure msg -> Error (Zerror.create ~code:(Other "json_parse_error") ~msg:(Printf.sprintf "%s: %s" context msg) ())-| exn -> Error (Zerror.create ~code:(Other "json_parse_error") ~msg:(Printf.sprintf "%s: %s" context (Printexc.to_string exn)) ())
···+| Some _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a string" key) ())+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a valid float" key) ()))+| Some _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a float" key) ())+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| Some _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not a boolean" key) ())+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| Some _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not an object" key) ())+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| Some _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' is not an array" key) ())+| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())···+| _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON object" context) ())···+| _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON array" context) ())···+Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" field) ()+Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' type mismatch: expected %s" field expected) ()+| Failure msg -> Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:(Printf.sprintf "%s: %s" context msg) ())+| exn -> Error (Zulip_types.create_error ~code:(Other "json_parse_error") ~msg:(Printf.sprintf "%s: %s" context (Printexc.to_string exn)) ())
+13
-13
stack/zulip/lib/zulip/lib/jsonu.mli
+13
-13
stack/zulip/lib/zulip/lib/jsonu.mli
···············-val with_object : string -> ((string * json) list -> ('a, Zerror.t) result) -> json -> ('a, Zerror.t) result-val with_array : string -> (json -> ('a, Zerror.t) result) -> json -> ('a list, Zerror.t) result···
············+val get_object : (string * json) list -> string -> ((string * json) list, Zulip_types.zerror) result···+val with_object : string -> ((string * json) list -> ('a, Zulip_types.zerror) result) -> json -> ('a, Zulip_types.zerror) result+val with_array : string -> (json -> ('a, Zulip_types.zerror) result) -> json -> ('a list, Zulip_types.zerror) result···+val parse_with_error : string -> (unit -> ('a, Zulip_types.zerror) result) -> ('a, Zulip_types.zerror) result
+13
-14
stack/zulip/lib/zulip/lib/jsonu_syntax.ml
+13
-14
stack/zulip/lib/zulip/lib/jsonu_syntax.ml
······-| None -> Error (Zerror.create ~code:(Other "missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" name) ())·········-| Error e -> Error (Zerror.create ~code:(Zerror.code e) ~msg:(Printf.sprintf "%s: %s" ctx (Zerror.message e)) ())
······+| None -> Error (Zulip_types.create_error ~code:(Other "missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" name) ())······+with _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected integer" ()))+with _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected float" ()))···+| Error e -> Error (Zulip_types.create_error ~code:(Zulip_types.error_code e) ~msg:(Printf.sprintf "%s: %s" ctx (Zulip_types.error_message e)) ())
+11
-12
stack/zulip/lib/zulip/lib/jsonu_syntax.mli
+11
-12
stack/zulip/lib/zulip/lib/jsonu_syntax.mli
············
······+val field_opt : (string * json) list -> string -> 'a parser -> ('a option, Zulip_types.zerror) result+val field_or : (string * json) list -> string -> 'a parser -> 'a -> ('a, Zulip_types.zerror) result······+val traverse : ('a -> ('b, Zulip_types.zerror) result) -> 'a list -> ('b list, Zulip_types.zerror) result
+1
-1
stack/zulip/lib/zulip/lib/message.mli
+1
-1
stack/zulip/lib/zulip/lib/message.mli
+1
-1
stack/zulip/lib/zulip/lib/message_response.mli
+1
-1
stack/zulip/lib/zulip/lib/message_response.mli
+5
-5
stack/zulip/lib/zulip/lib/messages.mli
+5
-5
stack/zulip/lib/zulip/lib/messages.mli
···-val edit : Client.t -> message_id:int -> ?content:string -> ?topic:string -> unit -> (unit, Zerror.t) result···
···+val edit : Client.t -> message_id:int -> ?content:string -> ?topic:string -> unit -> (unit, Zulip_types.zerror) result···
+2
-2
stack/zulip/lib/zulip/lib/user.mli
+2
-2
stack/zulip/lib/zulip/lib/user.mli
+2
-2
stack/zulip/lib/zulip/lib/users.ml
+2
-2
stack/zulip/lib/zulip/lib/users.ml
···-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Invalid users response format" ()))-| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Users response must be an object" ()))
···+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Invalid users response format" ()))+| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Users response must be an object" ()))
+4
-4
stack/zulip/lib/zulip/lib/users.mli
+4
-4
stack/zulip/lib/zulip/lib/users.mli
···+val create_user : Client.t -> email:string -> full_name:string -> (unit, Zulip_types.zerror) result
+48
stack/zulip/lib/zulip/lib/zulip.ml
+48
stack/zulip/lib/zulip/lib/zulip.ml
···
···
+78
stack/zulip/lib/zulip/lib/zulip.mli
+78
stack/zulip/lib/zulip/lib/zulip.mli
···
···+val create_error : code:error_code -> msg:string -> ?extra:(string * json) list -> unit -> zerror
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_config.ml
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_config.ml
···-Error (Zulip.Zerror.create ~code:(Other "file_error") ~msg:("Cannot read config file: " ^ msg) ())-Error (Zulip.Zerror.create ~code:(Other "parse_error") ~msg:("Error parsing config: " ^ Printexc.to_string exn) ())···-Error (Zulip.Zerror.create ~code:(Other "env_error") ~msg:("Error reading environment: " ^ Printexc.to_string exn) ())···-| None -> Error (Zulip.Zerror.create ~code:(Other "config_missing") ~msg:("Required config key missing: " ^ key) ())
···+Error (Zulip.create_error ~code:(Other "file_error") ~msg:("Cannot read config file: " ^ msg) ())+Error (Zulip.create_error ~code:(Other "parse_error") ~msg:("Error parsing config: " ^ Printexc.to_string exn) ())···+Error (Zulip.create_error ~code:(Other "env_error") ~msg:("Error reading environment: " ^ Printexc.to_string exn) ())···+| None -> Error (Zulip.create_error ~code:(Other "config_missing") ~msg:("Required config key missing: " ^ key) ())
+3
-3
stack/zulip/lib/zulip_bot/lib/bot_config.mli
+3
-3
stack/zulip/lib/zulip_bot/lib/bot_config.mli
···
···
+2
-2
stack/zulip/lib/zulip_bot/lib/bot_handler.ml
+2
-2
stack/zulip/lib/zulip_bot/lib/bot_handler.ml
······
······
+3
-3
stack/zulip/lib/zulip_bot/lib/bot_handler.mli
+3
-3
stack/zulip/lib/zulip_bot/lib/bot_handler.mli
·········
·········
+8
-8
stack/zulip/lib/zulip_bot/lib/bot_runner.ml
+8
-8
stack/zulip/lib/zulip_bot/lib/bot_runner.ml
···············-| Error err -> Error (Zulip.Zerror.create ~code:(Zulip.Zerror.Other "parse_error") ~msg:("Failed to parse webhook message: " ^ err) ())
···············+| Error err -> Error (Zulip.create_error ~code:(Zulip.Other "parse_error") ~msg:("Failed to parse webhook message: " ^ err) ())
+2
-2
stack/zulip/lib/zulip_bot/lib/bot_runner.mli
+2
-2
stack/zulip/lib/zulip_bot/lib/bot_runner.mli
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_storage.ml
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_storage.ml
············
············
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_storage.mli
+4
-4
stack/zulip/lib/zulip_bot/lib/bot_storage.mli
···
···
+8
-8
stack/zulip/lib/zulip_bot/lib/message.ml
+8
-8
stack/zulip/lib/zulip_bot/lib/message.ml
·····················-Log.warn (fun m -> m "Failed to parse user in display_recipient: %s" (Zulip.Zerror.message err));···
·····················+Log.warn (fun m -> m "Failed to parse user in display_recipient: %s" (Zulip.error_message err));···
+7
-7
stack/zulip/lib/zulip_bot/lib/message.mli
+7
-7
stack/zulip/lib/zulip_bot/lib/message.mli
·····················
·····················
+4
-4
stack/zulip/lib/zulip_botserver/lib/bot_registry.mli
+4
-4
stack/zulip/lib/zulip_botserver/lib/bot_registry.mli
···-create_config:(Server_config.Bot_config.t -> (Zulip_bot.Bot_config.t, Zulip.Zerror.t) result) ->-val create_handler : t -> Server_config.Bot_config.t -> Zulip.Client.t -> (Zulip_bot.Bot_handler.t, Zulip.Zerror.t) result···
···+val create_handler : t -> Server_config.Bot_config.t -> Zulip.Client.t -> (Zulip_bot.Bot_handler.t, Zulip.zerror) result···
+2
-2
stack/zulip/lib/zulip_botserver/lib/bot_server.mli
+2
-2
stack/zulip/lib/zulip_botserver/lib/bot_server.mli
+2
-2
stack/zulip/lib/zulip_botserver/lib/server_config.mli
+2
-2
stack/zulip/lib/zulip_botserver/lib/server_config.mli
+4
-4
stack/zulip/lib/zulip_botserver/lib/webhook_handler.mli
+4
-4
stack/zulip/lib/zulip_botserver/lib/webhook_handler.mli
···
···