My agentic slop goes here. Not intended for anyone else!

more

+3 -3
stack/zulip/examples/atom_feed_bot.ml
···
in
match Zulip.Messages.send client message with
| Ok _ -> Printf.printf "Posted: %s\n" entry.title
-
| Error e -> Printf.eprintf "Error posting: %s\n" (Zulip.Zerror.message e)
+
| Error e -> Printf.eprintf "Error posting: %s\n" (Zulip.error_message e)
let process_feed client state (url, channel, topic) =
Printf.printf "Processing feed: %s -> #%s/%s\n" url channel topic;
···
let auth = match Zulip.Auth.from_zuliprc () with
| Ok a -> a
| Error e ->
-
Printf.eprintf "Failed to load auth: %s\n" (Zulip.Zerror.message e);
+
Printf.eprintf "Failed to load auth: %s\n" (Zulip.error_message e);
exit 1
in
···
let auth = match Zulip.Auth.from_zuliprc () with
| Ok a -> a
| Error e ->
-
Log.err (fun m -> m "Failed to load auth: %s" (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to load auth: %s" (Zulip.error_message e));
exit 1
in
+1 -1
stack/zulip/examples/bot_example.ml
···
| `O fields -> String.concat ", " (List.map fst fields)
| _ -> "unknown format")
| Error err ->
-
Printf.printf "❌ API request failed: %s\n" (Zulip.Zerror.message err));
+
Printf.printf "❌ API request failed: %s\n" (Zulip.error_message err));
Printf.printf "\n🎉 Bot example completed successfully!\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
···
Log.info (fun m -> m "Stored key=%s value=%s for user %s" key value sender_name);
Printf.sprintf "✅ Stored: `%s` = `%s`" key value
| Error e ->
-
Log.err (fun m -> m "Failed to store key=%s: %s" key (Zulip.Zerror.message e));
-
Printf.sprintf "❌ Failed to store: %s" (Zulip.Zerror.message e))
+
Log.err (fun m -> m "Failed to store key=%s: %s" key (Zulip.error_message e));
+
Printf.sprintf "❌ Failed to store: %s" (Zulip.error_message e))
| None ->
"Usage: `store <key> <value>` - Example: `store name John`"
)
···
Log.info (fun m -> m "Deleted key=%s for user %s" key sender_name);
Printf.sprintf "🗑️ Deleted key: `%s`" key
| Error e ->
-
Log.err (fun m -> m "Failed to delete key=%s: %s" key (Zulip.Zerror.message e));
-
Printf.sprintf "❌ Failed to delete: %s" (Zulip.Zerror.message e)
+
Log.err (fun m -> m "Failed to delete key=%s: %s" key (Zulip.error_message e));
+
Printf.sprintf "❌ Failed to delete: %s" (Zulip.error_message e)
)
else if lower_msg = "list" then (
(* List all stored keys *)
···
let key_list = String.concat "\n" (List.map (fun k -> "• `" ^ k ^ "`") keys) in
Printf.sprintf "📋 Stored keys:\n%s\n\nUse `get <key>` to retrieve values." key_list
| Error e ->
-
Printf.sprintf "❌ Failed to list keys: %s" (Zulip.Zerror.message e)
+
Printf.sprintf "❌ Failed to list keys: %s" (Zulip.error_message e)
)
else
Printf.sprintf "Echo from %s: %s" sender_name cleaned_msg
···
Log.info (fun m -> m "Stored key=%s value=%s for user %s" key value sender_name);
Printf.sprintf "✅ Stored: `%s` = `%s`" key value
| Error e ->
-
Log.err (fun m -> m "Failed to store key=%s: %s" key (Zulip.Zerror.message e));
-
Printf.sprintf "❌ Failed to store: %s" (Zulip.Zerror.message e))
+
Log.err (fun m -> m "Failed to store key=%s: %s" key (Zulip.error_message e));
+
Printf.sprintf "❌ Failed to store: %s" (Zulip.error_message e))
| None ->
"Usage: `store <key> <value>` - Example: `store name John`"
)
···
Log.info (fun m -> m "Deleted key=%s for user %s" key sender_name);
Printf.sprintf "🗑️ Deleted key: `%s`" key
| Error e ->
-
Log.err (fun m -> m "Failed to delete key=%s: %s" key (Zulip.Zerror.message e));
-
Printf.sprintf "❌ Failed to delete: %s" (Zulip.Zerror.message e)
+
Log.err (fun m -> m "Failed to delete key=%s: %s" key (Zulip.error_message e));
+
Printf.sprintf "❌ Failed to delete: %s" (Zulip.error_message e)
)
else if lower_msg = "list" then (
(* List all stored keys *)
···
let key_list = String.concat "\n" (List.map (fun k -> "• `" ^ k ^ "`") keys) in
Printf.sprintf "📋 Stored keys:\n%s\n\nUse `get <key>` to retrieve values." key_list
| Error e ->
-
Printf.sprintf "❌ Failed to list keys: %s" (Zulip.Zerror.message e)
+
Printf.sprintf "❌ Failed to list keys: %s" (Zulip.error_message e)
)
else
Printf.sprintf "Echo from %s: %s" sender_name cleaned_msg
···
Log.info (fun m -> m "Server: %s" (Zulip.Auth.server_url a));
a
| Error e ->
-
Log.err (fun m -> m "Failed to load .zuliprc: %s" (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to load .zuliprc: %s" (Zulip.error_message e));
Log.app (fun m -> m "\nPlease create a ~/.zuliprc file with:");
Log.app (fun m -> m "[api]");
Log.app (fun m -> m "email=bot@example.com");
+3 -3
stack/zulip/examples/test_client.ml
···
Printf.printf " Email: %s\n" (Zulip.Auth.email auth);
auth
| Error e ->
-
Printf.eprintf "Failed to load auth: %s\n" (Zulip.Zerror.message e);
+
Printf.eprintf "Failed to load auth: %s\n" (Zulip.error_message e);
(* Create a test auth *)
Zulip.Auth.create
~server_url:"https://example.zulipchat.com"
···
Printf.printf "Message sent successfully!\n";
Printf.printf "Message ID: %d\n" (Zulip.Message_response.id response)
| Error e ->
-
Printf.eprintf "Failed to send message: %s\n" (Zulip.Zerror.message e)
+
Printf.eprintf "Failed to send message: %s\n" (Zulip.error_message e)
let test_fetch_messages env auth =
Printf.printf "\nTesting message fetch...\n";
···
| _ -> Printf.printf "No messages field found\n")
| _ -> Printf.printf "Unexpected JSON format\n")
| Error e ->
-
Printf.eprintf "Failed to fetch messages: %s\n" (Zulip.Zerror.message e)
+
Printf.eprintf "Failed to fetch messages: %s\n" (Zulip.error_message e)
let () =
Printf.printf "Zulip OCaml Client Test\n";
+2 -2
stack/zulip/examples/test_realtime_bot.ml
···
(match Bot_storage.put storage ~key:test_key ~value:test_value with
| Ok () -> Log.info (fun m -> m "Stored message in bot storage")
-
| Error e -> Log.err (fun m -> m "Storage error: %s" (Zulip.Zerror.message e)));
+
| Error e -> Log.err (fun m -> m "Storage error: %s" (Zulip.error_message e)));
(* Always reply with confirmation *)
let reply = Printf.sprintf "Test bot received: %s"
···
Log.info (fun m -> m "Server: %s" (Zulip.Auth.server_url a));
a
| Error e ->
-
Log.err (fun m -> m "Failed to load .zuliprc: %s" (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to load .zuliprc: %s" (Zulip.error_message e));
exit 1
in
+3 -3
stack/zulip/lib/zulip/lib/auth.ml
···
in
Ok { server_url; email; api_key }
| _ ->
-
Error (Zerror.create ~code:(Other "config_missing")
+
Error (Zulip_types.create_error ~code:(Other "config_missing")
~msg:"Missing required fields: email, key, site in zuliprc" ())
with
| Sys_error msg ->
-
Error (Zerror.create ~code:(Other "file_error") ~msg:("Cannot read zuliprc file: " ^ msg) ())
+
Error (Zulip_types.create_error ~code:(Other "file_error") ~msg:("Cannot read zuliprc file: " ^ msg) ())
| exn ->
-
Error (Zerror.create ~code:(Other "parse_error") ~msg:("Error parsing zuliprc: " ^ Printexc.to_string exn) ())
+
Error (Zulip_types.create_error ~code:(Other "parse_error") ~msg:("Error parsing zuliprc: " ^ Printexc.to_string exn) ())
let server_url t = t.server_url
let email t = t.email
+1 -1
stack/zulip/lib/zulip/lib/auth.mli
···
type t
val create : server_url:string -> email:string -> api_key:string -> t
-
val from_zuliprc : ?path:string -> unit -> (t, Zerror.t) result
+
val from_zuliprc : ?path:string -> unit -> (t, Zulip_types.zerror) result
val server_url : t -> string
val email : t -> string
val to_basic_auth_header : t -> string
+2 -2
stack/zulip/lib/zulip/lib/channel.ml
···
Ok { name; description; invite_only; history_public_to_subscribers }
| _ ->
-
Error (Zerror.create ~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 must be an object" ())
with
| exn ->
-
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 parsing failed: " ^ Printexc.to_string exn) ())
let pp fmt t = Format.fprintf fmt "Channel{name=%s, description=%s}" t.name t.description
+2 -2
stack/zulip/lib/zulip/lib/channel.mli
···
val description : t -> string
val invite_only : t -> bool
val history_public_to_subscribers : t -> bool
-
val to_json : t -> Zerror.json
-
val of_json : Zerror.json -> (t, Zerror.t) result
+
val to_json : t -> Zulip_types.json
+
val of_json : Zulip_types.json -> (t, Zulip_types.zerror) result
val pp : Format.formatter -> t -> unit
+2 -2
stack/zulip/lib/zulip/lib/channels.ml
···
| Error _ -> acc
) [] channel_list in
Ok (List.rev channels)
-
| _ -> 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" ()))
| Error err -> Error err
let subscribe client ~channels =
+5 -5
stack/zulip/lib/zulip/lib/channels.mli
···
-
val create_channel : Client.t -> Channel.t -> (unit, Zerror.t) result
-
val delete : Client.t -> name:string -> (unit, Zerror.t) result
-
val list : Client.t -> (Channel.t list, Zerror.t) result
-
val subscribe : Client.t -> channels:string list -> (unit, Zerror.t) result
-
val unsubscribe : Client.t -> channels:string list -> (unit, Zerror.t) result
+
val create_channel : Client.t -> Channel.t -> (unit, Zulip_types.zerror) result
+
val delete : Client.t -> name:string -> (unit, Zulip_types.zerror) result
+
val list : Client.t -> (Channel.t list, Zulip_types.zerror) result
+
val subscribe : Client.t -> channels:string list -> (unit, Zulip_types.zerror) result
+
val unsubscribe : Client.t -> channels:string list -> (unit, Zulip_types.zerror) result
+6 -6
stack/zulip/lib/zulip/lib/client.ml
···
| _ -> "Unknown error"
in
let code = match List.assoc_opt "code" fields with
-
| Some (`String s) -> Zerror.code_of_string s
-
| _ -> Zerror.Other "unknown"
+
| Some (`String s) -> Zulip_types.error_code_of_string s
+
| _ -> Zulip_types.Other "unknown"
in
Log.warn (fun m -> m "API error: %s (code: %s)" msg
-
(Zerror.code_to_string code));
-
Error (Zerror.create ~code ~msg ())
+
(Zulip_types.error_code_to_string code));
+
Error (Zulip_types.create_error ~code ~msg ())
| _ ->
if status >= 200 && status < 300 then
Ok json
else
(Log.warn (fun m -> m "HTTP error: %d" status);
-
Error (Zerror.create ~code:(Zerror.Other (string_of_int status))
+
Error (Zulip_types.create_error ~code:(Zulip_types.Other (string_of_int status))
~msg:("HTTP error: " ^ string_of_int status) ())))
| _ ->
if status >= 200 && status < 300 then
Ok json
else
(Log.err (fun m -> m "Invalid JSON response");
-
Error (Zerror.create ~code:(Zerror.Other "json_parse")
+
Error (Zulip_types.create_error ~code:(Zulip_types.Other "json_parse")
~msg:"Invalid JSON response" ()))
let pp fmt t =
+1 -1
stack/zulip/lib/zulip/lib/client.mli
···
?params:(string * string) list ->
?body:string ->
unit ->
-
(Zerror.json, Zerror.t) result
+
(Zulip_types.json, Zulip_types.zerror) result
(** Make an HTTP request to the Zulip API using the requests library *)
val pp : Format.formatter -> t -> unit
+3 -3
stack/zulip/lib/zulip/lib/event.ml
···
type t = {
id : int;
type_ : Event_type.t;
-
data : Zerror.json;
+
data : Zulip_types.json;
}
let id t = t.id
···
Ok { id; type_; data }
| _ ->
-
Error (Zerror.create ~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 must be an object" ())
with
| exn ->
-
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 parsing failed: " ^ Printexc.to_string exn) ())
let pp fmt t = Format.fprintf fmt "Event{id=%d, type=%a}" t.id Event_type.pp t.type_
+2 -2
stack/zulip/lib/zulip/lib/event.mli
···
val id : t -> int
val type_ : t -> Event_type.t
-
val data : t -> Zerror.json
-
val of_json : Zerror.json -> (t, Zerror.t) result
+
val data : t -> Zulip_types.json
+
val of_json : Zulip_types.json -> (t, Zulip_types.zerror) result
val pp : Format.formatter -> t -> unit
+5 -5
stack/zulip/lib/zulip/lib/event_queue.ml
···
| `O fields ->
(match List.assoc_opt "queue_id" fields with
| Some (`String queue_id) -> Ok { id = queue_id }
-
| _ -> 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 (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 err -> Error err
let id t = t.id
···
match Event.of_json event_json with
| Ok event -> event :: acc
| Error e ->
-
Log.warn (fun m -> m "Failed to parse event: %s" (Zerror.message e));
+
Log.warn (fun m -> m "Failed to parse event: %s" (Zulip_types.error_message e));
acc
) [] event_list in
Ok (List.rev events)
| Some _other ->
Log.warn (fun m -> m "Events field is not an array");
-
Error (Zerror.create ~code:(Other "api_error") ~msg:"Invalid events response format" ())
+
Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Invalid events response format" ())
| None ->
Log.debug (fun m -> m "No events field in response");
Ok [])
-
| _ -> Error (Zerror.create ~code:(Other "api_error") ~msg:"Events response must be an object" ()))
+
| _ -> Error (Zulip_types.create_error ~code:(Other "api_error") ~msg:"Events response must be an object" ()))
| Error err -> Error err
let delete t client =
+3 -3
stack/zulip/lib/zulip/lib/event_queue.mli
···
Client.t ->
?event_types:Event_type.t list ->
unit ->
-
(t, Zerror.t) result
+
(t, Zulip_types.zerror) result
val id : t -> string
-
val get_events : t -> Client.t -> ?last_event_id:int -> unit -> (Event.t list, Zerror.t) result
-
val delete : t -> Client.t -> (unit, Zerror.t) result
+
val get_events : t -> Client.t -> ?last_event_id:int -> unit -> (Event.t list, Zulip_types.zerror) result
+
val delete : t -> Client.t -> (unit, Zulip_types.zerror) result
val pp : Format.formatter -> t -> unit
+21 -23
stack/zulip/lib/zulip/lib/jsonu.ml
···
(** JSON utility functions for Zulip API *)
-
open Zerror
-
-
type json = Zerror.json
+
type json = Zulip_types.json
(** {1 Field extraction utilities} *)
let get_string fields key =
match List.assoc_opt key fields with
| Some (`String s) -> Ok s
-
| 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) ())
+
| 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) ())
let get_string_default fields key default =
match get_string fields key with
···
match List.assoc_opt key fields with
| Some json ->
(try Ok (to_int_flex json) with
-
| Failure msg -> Error (Zerror.create ~code:(Other "json_type_error") ~msg ()))
-
| None -> Error (Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())
+
| Failure msg -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg ()))
+
| None -> Error (Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Field '%s' not found" key) ())
let get_int_default fields key default =
match get_int fields key with
···
| Some (`Float f) -> Ok f
| Some (`String s) ->
(try Ok (float_of_string s) with
-
| _ -> 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) ())
+
| _ -> 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) ())
let get_float_default fields key default =
match get_float fields key with
···
let get_bool fields key =
match List.assoc_opt key fields with
| Some (`Bool b) -> Ok b
-
| 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 (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) ())
let get_bool_default fields key default =
match get_bool fields key with
···
let get_object fields key =
match List.assoc_opt key fields with
| Some (`O obj) -> Ok obj
-
| 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 (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) ())
let get_object_opt fields key =
match List.assoc_opt key fields with
···
let get_array fields key =
match List.assoc_opt key fields with
| Some (`A arr) -> Ok arr
-
| 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) ())
+
| 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) ())
let get_array_opt fields key =
match List.assoc_opt key fields with
···
let with_object context f = function
| `O fields -> f fields
-
| _ -> Error (Zerror.create ~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 object" context) ())
let with_array context f json =
match json with
···
| Error e -> Error e
in
process [] items
-
| _ -> Error (Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON array" context) ())
+
| _ -> Error (Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "%s: expected JSON array" context) ())
(** {1 Construction utilities} *)
···
(** {1 Error handling} *)
let json_error msg =
-
Zerror.create ~code:(Other "json_error") ~msg ()
+
Zulip_types.create_error ~code:(Other "json_error") ~msg ()
let field_missing_error field =
-
Zerror.create ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" field) ()
+
Zulip_types.create_error ~code:(Other "json_missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" field) ()
let type_mismatch_error field expected =
-
Zerror.create ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' type mismatch: expected %s" field expected) ()
+
Zulip_types.create_error ~code:(Other "json_type_error") ~msg:(Printf.sprintf "Field '%s' type mismatch: expected %s" field expected) ()
let parse_with_error context f =
try f ()
with
-
| 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)) ())
+
| 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)) ())
(** {1 Debugging utilities} *)
+13 -13
stack/zulip/lib/zulip/lib/jsonu.mli
···
(** {1 Type definitions} *)
-
type json = Zerror.json
+
type json = Zulip_types.json
(** {1 Field extraction utilities} *)
(** Extract a string field from a JSON object *)
-
val get_string : (string * json) list -> string -> (string, Zerror.t) result
+
val get_string : (string * json) list -> string -> (string, Zulip_types.zerror) result
(** Extract a string field with a default value *)
val get_string_default : (string * json) list -> string -> string -> string
···
val get_string_opt : (string * json) list -> string -> string option
(** Extract an integer field (handles both int and float representations) *)
-
val get_int : (string * json) list -> string -> (int, Zerror.t) result
+
val get_int : (string * json) list -> string -> (int, Zulip_types.zerror) result
(** Extract an integer field with a default value *)
val get_int_default : (string * json) list -> string -> int -> int
···
val get_int_opt : (string * json) list -> string -> int option
(** Extract a float field *)
-
val get_float : (string * json) list -> string -> (float, Zerror.t) result
+
val get_float : (string * json) list -> string -> (float, Zulip_types.zerror) result
(** Extract a float field with a default value *)
val get_float_default : (string * json) list -> string -> float -> float
(** Extract a boolean field *)
-
val get_bool : (string * json) list -> string -> (bool, Zerror.t) result
+
val get_bool : (string * json) list -> string -> (bool, Zulip_types.zerror) result
(** Extract a boolean field with a default value *)
val get_bool_default : (string * json) list -> string -> bool -> bool
···
val get_bool_opt : (string * json) list -> string -> bool option
(** Extract a JSON object field *)
-
val get_object : (string * json) list -> string -> ((string * json) list, Zerror.t) result
+
val get_object : (string * json) list -> string -> ((string * json) list, Zulip_types.zerror) result
(** Extract an optional JSON object field *)
val get_object_opt : (string * json) list -> string -> (string * json) list option
(** Extract a JSON array field *)
-
val get_array : (string * json) list -> string -> (json list, Zerror.t) result
+
val get_array : (string * json) list -> string -> (json list, Zulip_types.zerror) result
(** Extract an optional JSON array field *)
val get_array_opt : (string * json) list -> string -> json list option
···
(** {1 Object parsing utilities} *)
(** Parse a JSON value as an object, applying a function to its fields *)
-
val with_object : string -> ((string * json) list -> ('a, Zerror.t) result) -> json -> ('a, Zerror.t) result
+
val with_object : string -> ((string * json) list -> ('a, Zulip_types.zerror) result) -> json -> ('a, Zulip_types.zerror) result
(** Parse a JSON value as an array, applying a function to each element *)
-
val with_array : string -> (json -> ('a, Zerror.t) result) -> json -> ('a list, Zerror.t) result
+
val with_array : string -> (json -> ('a, Zulip_types.zerror) result) -> json -> ('a list, Zulip_types.zerror) result
(** {1 Construction utilities} *)
···
(** {1 Error handling} *)
(** Create a JSON parsing error *)
-
val json_error : string -> Zerror.t
+
val json_error : string -> Zulip_types.zerror
(** Create a field missing error *)
-
val field_missing_error : string -> Zerror.t
+
val field_missing_error : string -> Zulip_types.zerror
(** Create a type mismatch error *)
-
val type_mismatch_error : string -> string -> Zerror.t
+
val type_mismatch_error : string -> string -> Zulip_types.zerror
(** Wrap a parsing function with exception handling *)
-
val parse_with_error : string -> (unit -> ('a, Zerror.t) result) -> ('a, Zerror.t) result
+
val parse_with_error : string -> (unit -> ('a, Zulip_types.zerror) result) -> ('a, Zulip_types.zerror) result
(** {1 Debugging utilities} *)
+13 -14
stack/zulip/lib/zulip/lib/jsonu_syntax.ml
···
(** Syntax module for monadic and applicative JSON parsing *)
-
open Zerror
-
-
type 'a parser = json -> ('a, Zerror.t) result
+
type json = Zulip_types.json
+
type 'a parser = json -> ('a, Zulip_types.zerror) result
(** Monadic bind operator for sequential parsing with error handling *)
let ( let* ) = Result.bind
···
(** Convert option to result with error message *)
let required name = function
| Some v -> Ok v
-
| None -> Error (Zerror.create ~code:(Other "missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" name) ())
+
| None -> Error (Zulip_types.create_error ~code:(Other "missing_field") ~msg:(Printf.sprintf "Required field '%s' not found" name) ())
(** Convert option to result with default *)
let default v = function
···
let pure x = Ok x
(** Fail with an error message *)
-
let fail msg = Error (Zerror.create ~code:(Other "parse_error") ~msg ())
+
let fail msg = Error (Zulip_types.create_error ~code:(Other "parse_error") ~msg ())
(** Map over a list with error handling *)
let traverse f lst =
···
(** Common parsers *)
let string = function
| `String s -> Ok s
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected string" ())
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected string" ())
let int = function
| `Float f -> Ok (int_of_float f)
| `String s ->
(try Ok (int_of_string s)
-
with _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected integer" ()))
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected integer" ())
+
with _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected integer" ()))
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected integer" ())
let float = function
| `Float f -> Ok f
| `String s ->
(try Ok (float_of_string s)
-
with _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected float" ()))
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected float" ())
+
with _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected float" ()))
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected float" ())
let bool = function
| `Bool b -> Ok b
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected boolean" ())
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected boolean" ())
let array parser = function
| `A items -> traverse parser items
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected array" ())
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected array" ())
let object_ = function
| `O fields -> Ok fields
-
| _ -> Error (Zerror.create ~code:(Other "type_error") ~msg:"Expected object" ())
+
| _ -> Error (Zulip_types.create_error ~code:(Other "type_error") ~msg:"Expected object" ())
(** Run a parser on JSON *)
let parse parser json = parser json
···
let with_context ctx parser json =
match parser json with
| Ok v -> Ok v
-
| Error e -> Error (Zerror.create ~code:(Zerror.code e) ~msg:(Printf.sprintf "%s: %s" ctx (Zerror.message e)) ())
+
| 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
···
]}
*)
-
open Zerror
-
-
type 'a parser = json -> ('a, Zerror.t) result
+
type json = Zulip_types.json
+
type 'a parser = json -> ('a, Zulip_types.zerror) result
(** {1 Binding Operators} *)
···
(** {1 Field Extraction} *)
(** Parse a required field with a custom parser *)
-
val field : (string * json) list -> string -> 'a parser -> ('a, Zerror.t) result
+
val field : (string * json) list -> string -> 'a parser -> ('a, Zulip_types.zerror) result
(** Parse an optional field with a custom parser *)
-
val field_opt : (string * json) list -> string -> 'a parser -> ('a option, Zerror.t) result
+
val field_opt : (string * json) list -> string -> 'a parser -> ('a option, Zulip_types.zerror) result
(** Parse a field with a default value if missing or fails *)
-
val field_or : (string * json) list -> string -> 'a parser -> 'a -> ('a, Zerror.t) result
+
val field_or : (string * json) list -> string -> 'a parser -> 'a -> ('a, Zulip_types.zerror) result
(** {1 Basic Parsers} *)
···
val array : 'a parser -> 'a list parser
(** Parse a JSON object to get its fields *)
-
val object_ : json -> ((string * json) list, Zerror.t) result
+
val object_ : json -> ((string * json) list, Zulip_types.zerror) result
(** {1 Utility Functions} *)
(** Convert option to result with error message *)
-
val required : string -> 'a option -> ('a, Zerror.t) result
+
val required : string -> 'a option -> ('a, Zulip_types.zerror) result
(** Get value from option with default *)
val default : 'a -> 'a option -> 'a
···
val pure : 'a -> ('a, 'e) result
(** Fail with an error message *)
-
val fail : string -> ('a, Zerror.t) result
+
val fail : string -> ('a, Zulip_types.zerror) result
(** Map over a list with error handling *)
-
val traverse : ('a -> ('b, Zerror.t) result) -> 'a list -> ('b list, Zerror.t) result
+
val traverse : ('a -> ('b, Zulip_types.zerror) result) -> 'a list -> ('b list, Zulip_types.zerror) result
(** Filter and map over a list, dropping errors *)
-
val filter_map : ('a -> ('b, Zerror.t) result) -> 'a list -> 'b list
+
val filter_map : ('a -> ('b, Zulip_types.zerror) result) -> 'a list -> 'b list
(** Run a parser on JSON *)
-
val parse : 'a parser -> json -> ('a, Zerror.t) result
+
val parse : 'a parser -> json -> ('a, Zulip_types.zerror) result
(** Run a parser with error context *)
val with_context : string -> 'a parser -> 'a parser
+1 -1
stack/zulip/lib/zulip/lib/message.mli
···
val queue_id : t -> string option
val local_id : t -> string option
val read_by_sender : t -> bool
-
val to_json : t -> Zerror.json
+
val to_json : t -> Zulip_types.json
val pp : Format.formatter -> t -> unit
+1 -1
stack/zulip/lib/zulip/lib/message_response.mli
···
val id : t -> int
val automatic_new_visibility_policy : t -> string option
-
val of_json : Zerror.json -> (t, Zerror.t) result
+
val of_json : Zulip_types.json -> (t, Zulip_types.zerror) result
val pp : Format.formatter -> t -> unit
+5 -5
stack/zulip/lib/zulip/lib/messages.mli
···
-
val send : Client.t -> Message.t -> (Message_response.t, Zerror.t) result
-
val edit : Client.t -> message_id:int -> ?content:string -> ?topic:string -> unit -> (unit, Zerror.t) result
-
val delete : Client.t -> message_id:int -> (unit, Zerror.t) result
-
val get : Client.t -> message_id:int -> (Zerror.json, Zerror.t) result
+
val send : Client.t -> Message.t -> (Message_response.t, Zulip_types.zerror) result
+
val edit : Client.t -> message_id:int -> ?content:string -> ?topic:string -> unit -> (unit, Zulip_types.zerror) result
+
val delete : Client.t -> message_id:int -> (unit, Zulip_types.zerror) result
+
val get : Client.t -> message_id:int -> (Zulip_types.json, Zulip_types.zerror) result
val get_messages :
Client.t ->
?anchor:string ->
···
?num_after:int ->
?narrow:string list ->
unit ->
-
(Zerror.json, Zerror.t) result
+
(Zulip_types.json, Zulip_types.zerror) result
+2 -2
stack/zulip/lib/zulip/lib/user.mli
···
val is_active : t -> bool
val is_admin : t -> bool
val is_bot : t -> bool
-
val to_json : t -> Zerror.json
-
val of_json : Zerror.json -> (t, Zerror.t) result
+
val to_json : t -> Zulip_types.json
+
val of_json : Zulip_types.json -> (t, Zulip_types.zerror) result
val pp : Format.formatter -> t -> unit
+2 -2
stack/zulip/lib/zulip/lib/users.ml
···
| Error _ -> acc
) [] user_list in
Ok (List.rev users)
-
| _ -> 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" ()))
| Error err -> Error err
let get client ~email =
+4 -4
stack/zulip/lib/zulip/lib/users.mli
···
-
val list : Client.t -> (User.t list, Zerror.t) result
-
val get : Client.t -> email:string -> (User.t, Zerror.t) result
-
val create_user : Client.t -> email:string -> full_name:string -> (unit, Zerror.t) result
-
val deactivate : Client.t -> email:string -> (unit, Zerror.t) result
+
val list : Client.t -> (User.t list, Zulip_types.zerror) result
+
val get : Client.t -> email:string -> (User.t, Zulip_types.zerror) result
+
val create_user : Client.t -> email:string -> full_name:string -> (unit, Zulip_types.zerror) result
+
val deactivate : Client.t -> email:string -> (unit, Zulip_types.zerror) result
+48
stack/zulip/lib/zulip/lib/zulip.ml
···
+
(** Main module for Zulip OCaml API bindings *)
+
+
(* Re-export core types from Zulip_types *)
+
type json = Zulip_types.json
+
type error_code = Zulip_types.error_code =
+
| Invalid_api_key
+
| Request_variable_missing
+
| Bad_request
+
| User_deactivated
+
| Realm_deactivated
+
| Rate_limit_hit
+
| Other of string
+
+
type zerror = Zulip_types.zerror = {
+
code : error_code;
+
message : string;
+
extra : (string * json) list;
+
}
+
+
let error_code_to_string = Zulip_types.error_code_to_string
+
let error_code_of_string = Zulip_types.error_code_of_string
+
let create_error = Zulip_types.create_error
+
let error_code = Zulip_types.error_code
+
let error_message = Zulip_types.error_message
+
let error_extra = Zulip_types.error_extra
+
let pp_error = Zulip_types.pp_error
+
let error_of_json = Zulip_types.error_of_json
+
+
+
(** Re-export all submodules *)
+
module Auth = Auth
+
module Client = Client
+
module Message = Message
+
module Message_type = Message_type
+
module Message_response = Message_response
+
module Messages = Messages
+
module Channel = Channel
+
module Channels = Channels
+
module User = User
+
module Users = Users
+
module Event = Event
+
module Event_type = Event_type
+
module Event_queue = Event_queue
+
+
(** JSON utilities with short alias *)
+
module J = Jsonu
+
module Jsonu_syntax = Jsonu_syntax
+
module Jsonu = Jsonu
+78
stack/zulip/lib/zulip/lib/zulip.mli
···
+
(** Zulip API client library for OCaml
+
+
This module provides a comprehensive interface to the Zulip REST API,
+
with support for messages, channels, users, and real-time events. *)
+
+
(** {1 Core Types} *)
+
+
(** JSON type used throughout the API *)
+
type json = Zulip_types.json
+
+
(** {2 Error Handling} *)
+
+
(** Error codes returned by Zulip API *)
+
type error_code = Zulip_types.error_code =
+
| Invalid_api_key
+
| Request_variable_missing
+
| Bad_request
+
| User_deactivated
+
| Realm_deactivated
+
| Rate_limit_hit
+
| Other of string
+
+
(** Zulip-specific error type *)
+
type zerror = Zulip_types.zerror = {
+
code : error_code;
+
message : string;
+
extra : (string * json) list;
+
}
+
+
(** {3 Error Functions} *)
+
+
val error_code_to_string : error_code -> string
+
val error_code_of_string : string -> error_code
+
val create_error : code:error_code -> msg:string -> ?extra:(string * json) list -> unit -> zerror
+
val error_code : zerror -> error_code
+
val error_message : zerror -> string
+
val error_extra : zerror -> (string * json) list
+
val pp_error : Format.formatter -> zerror -> unit
+
val error_of_json : json -> zerror option
+
+
(** {1 Submodules} *)
+
+
(** Authentication management *)
+
module Auth = Auth
+
+
(** Client for making API requests *)
+
module Client = Client
+
+
(** Message types and operations *)
+
module Message = Message
+
module Message_type = Message_type
+
module Message_response = Message_response
+
module Messages = Messages
+
+
(** Channel (stream) operations *)
+
module Channel = Channel
+
module Channels = Channels
+
+
(** User management *)
+
module User = User
+
module Users = Users
+
+
(** Event handling *)
+
module Event = Event
+
module Event_type = Event_type
+
module Event_queue = Event_queue
+
+
(** {1 JSON Utilities} *)
+
+
(** JSON utility functions (abbreviated as J for convenience) *)
+
module J = Jsonu
+
+
(** JSON parsing syntax extensions *)
+
module Jsonu_syntax = Jsonu_syntax
+
+
(** Full JSON utilities module *)
+
module Jsonu = Jsonu
+
+4 -4
stack/zulip/lib/zulip_bot/lib/bot_config.ml
···
Ok config
with
| Sys_error msg ->
-
Error (Zulip.Zerror.create ~code:(Other "file_error") ~msg:("Cannot read config file: " ^ msg) ())
+
Error (Zulip.create_error ~code:(Other "file_error") ~msg:("Cannot read config file: " ^ msg) ())
| exn ->
-
Error (Zulip.Zerror.create ~code:(Other "parse_error") ~msg:("Error parsing config: " ^ Printexc.to_string exn) ())
+
Error (Zulip.create_error ~code:(Other "parse_error") ~msg:("Error parsing config: " ^ Printexc.to_string exn) ())
let from_env ~prefix =
try
···
Ok config
with
| exn ->
-
Error (Zulip.Zerror.create ~code:(Other "env_error") ~msg:("Error reading environment: " ^ Printexc.to_string exn) ())
+
Error (Zulip.create_error ~code:(Other "env_error") ~msg:("Error reading environment: " ^ Printexc.to_string exn) ())
let get t ~key =
Hashtbl.find_opt t key
···
let get_required t ~key =
match Hashtbl.find_opt t key with
| Some value -> Ok value
-
| None -> Error (Zulip.Zerror.create ~code:(Other "config_missing") ~msg:("Required config key missing: " ^ key) ())
+
| None -> Error (Zulip.create_error ~code:(Other "config_missing") ~msg:("Required config key missing: " ^ key) ())
let has_key t ~key =
Hashtbl.mem t key
+3 -3
stack/zulip/lib/zulip_bot/lib/bot_config.mli
···
val create : (string * string) list -> t
(** Load configuration from file *)
-
val from_file : string -> (t, Zulip.Zerror.t) result
+
val from_file : string -> (t, Zulip.zerror) result
(** Load configuration from environment variables with prefix *)
-
val from_env : prefix:string -> (t, Zulip.Zerror.t) result
+
val from_env : prefix:string -> (t, Zulip.zerror) result
(** Get a configuration value *)
val get : t -> key:string -> string option
(** Get a required configuration value, failing if not present *)
-
val get_required : t -> key:string -> (string, Zulip.Zerror.t) result
+
val get_required : t -> key:string -> (string, Zulip.zerror) result
(** Check if a key exists in configuration *)
val has_key : t -> key:string -> bool
+2 -2
stack/zulip/lib/zulip_bot/lib/bot_handler.ml
···
(** Module signature for bot implementations *)
module type Bot_handler = sig
-
val initialize : Bot_config.t -> (unit, Zulip.Zerror.t) result
+
val initialize : Bot_config.t -> (unit, Zulip.zerror) result
val usage : unit -> string
val description : unit -> string
val handle_message :
···
identity:Identity.t ->
message:Message.t ->
env:_ ->
-
(Response.t, Zulip.Zerror.t) result
+
(Response.t, Zulip.zerror) result
end
module type S = Bot_handler
+3 -3
stack/zulip/lib/zulip_bot/lib/bot_handler.mli
···
(** Module signature for bot implementations *)
module type Bot_handler = sig
(** Initialize the bot (called once on startup) *)
-
val initialize : Bot_config.t -> (unit, Zulip.Zerror.t) result
+
val initialize : Bot_config.t -> (unit, Zulip.zerror) result
(** Provide usage/help text *)
val usage : unit -> string
···
identity:Identity.t ->
message:Message.t ->
env:_ ->
-
(Response.t, Zulip.Zerror.t) result
+
(Response.t, Zulip.zerror) result
end
(** Shorter alias for Bot_handler *)
···
t
(** Process an incoming message with EIO environment *)
-
val handle_message_with_env : t -> _ -> Message.t -> (Response.t, Zulip.Zerror.t) result
+
val handle_message_with_env : t -> _ -> Message.t -> (Response.t, Zulip.zerror) result
(** Get bot identity *)
+8 -8
stack/zulip/lib/zulip_bot/lib/bot_runner.ml
···
Log.info (fun m -> m "Reply sent successfully (id: %d)"
(Zulip.Message_response.id resp))
| Error e ->
-
Log.err (fun m -> m "Error sending reply: %s" (Zulip.Zerror.message e)))
+
Log.err (fun m -> m "Error sending reply: %s" (Zulip.error_message e)))
| Ok (Bot_handler.Response.None) ->
Log.info (fun m -> m "Bot handler returned no response")
| Ok _ ->
Log.info (fun m -> m "Bot handler returned unhandled response type")
| Error e ->
-
Log.err (fun m -> m "Error handling message: %s" (Zulip.Zerror.message e))
+
Log.err (fun m -> m "Error handling message: %s" (Zulip.error_message e))
) else (
Log.info (fun m -> m "Not processing message (not mentioned and not private)")
)
···
match Zulip.Event_queue.register t.client
~event_types:[Zulip.Event_type.Message] () with
| Error e ->
-
Log.err (fun m -> m "Failed to register event queue: %s" (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to register event queue: %s" (Zulip.error_message e));
t.running <- false
| Ok queue ->
Log.info (fun m -> m "Event queue registered: %s" (Zulip.Event_queue.id queue));
···
(* Clean up event queue *)
(match Zulip.Event_queue.delete queue t.client with
| Ok () -> Log.info (fun m -> m "Event queue deleted")
-
| Error e -> Log.err (fun m -> m "Error deleting queue: %s" (Zulip.Zerror.message e)))
+
| Error e -> Log.err (fun m -> m "Error deleting queue: %s" (Zulip.error_message e)))
) else
(* Get events from Zulip *)
match Zulip.Event_queue.get_events queue t.client ~last_event_id () with
···
| Error e ->
(* Handle errors with exponential backoff *)
Log.warn (fun m -> m "Error getting events: %s (retrying in 2s)"
-
(Zulip.Zerror.message e));
+
(Zulip.error_message e));
(* Sleep using EIO clock *)
Eio.Time.sleep clock 2.0;
(* Check if error is recoverable *)
let is_recoverable =
-
match Zulip.Zerror.code e with
-
| Zulip.Zerror.Other "api_error" -> true
+
match Zulip.error_code e with
+
| Zulip.Other "api_error" -> true
| _ -> true (* For now, treat all errors as recoverable *)
in
···
(* Process webhook data and route to handler *)
(* Parse the webhook data into Message.t first *)
match Message.of_json webhook_data with
-
| 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) ())
| Ok message ->
match Bot_handler.handle_message_with_env t.handler t.env message with
| Ok response -> Ok (Some response)
+2 -2
stack/zulip/lib/zulip_bot/lib/bot_runner.mli
···
(** Process a single webhook event *)
val handle_webhook :
'env t ->
-
webhook_data:Zulip.Zerror.json ->
-
(Bot_handler.Response.t option, Zulip.Zerror.t) result
+
webhook_data:Zulip.json ->
+
(Bot_handler.Response.t option, Zulip.zerror) result
(** Gracefully shutdown the bot *)
val shutdown : 'env t -> unit
+4 -4
stack/zulip/lib/zulip_bot/lib/bot_storage.ml
···
) storage_fields
| None -> ())
| Error e ->
-
Log.warn (fun m -> m "Failed to load existing storage: %s" (Zulip.Zerror.message e)));
+
Log.warn (fun m -> m "Failed to load existing storage: %s" (Zulip.error_message e)));
{
client;
···
None)
| None -> None)
| Error e ->
-
Log.warn (fun m -> m "Error fetching key %s: %s" key (Zulip.Zerror.message e));
+
Log.warn (fun m -> m "Error fetching key %s: %s" key (Zulip.error_message e));
None
let put t ~key ~value =
···
t.dirty_keys <- List.filter ((<>) key) t.dirty_keys;
Ok ()
| Error e ->
-
Log.err (fun m -> m "Failed to store key %s: %s" key (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to store key %s: %s" key (Zulip.error_message e));
Error e
let contains t ~key =
···
t.dirty_keys <- [];
Ok ()
| Error e ->
-
Log.err (fun m -> m "Failed to flush storage: %s" (Zulip.Zerror.message e));
+
Log.err (fun m -> m "Failed to flush storage: %s" (Zulip.error_message e));
Error e
end
+4 -4
stack/zulip/lib/zulip_bot/lib/bot_storage.mli
···
val get : t -> key:string -> string option
(** Store a value in storage *)
-
val put : t -> key:string -> value:string -> (unit, Zulip.Zerror.t) result
+
val put : t -> key:string -> value:string -> (unit, Zulip.zerror) result
(** Check if a key exists in storage *)
val contains : t -> key:string -> bool
(** Remove a key from storage *)
-
val remove : t -> key:string -> (unit, Zulip.Zerror.t) result
+
val remove : t -> key:string -> (unit, Zulip.zerror) result
(** List all keys in storage *)
-
val keys : t -> (string list, Zulip.Zerror.t) result
+
val keys : t -> (string list, Zulip.zerror) result
(** Flush all dirty keys to the API *)
-
val flush : t -> (unit, Zulip.Zerror.t) result
+
val flush : t -> (unit, Zulip.zerror) result
+8 -8
stack/zulip/lib/zulip_bot/lib/message.ml
···
let full_name t = t.full_name
let short_name t = t.short_name
-
let of_json (json : Zulip.Zerror.json) : (t, Zulip.Zerror.t) result =
+
let of_json (json : Zulip.json) : (t, Zulip.zerror) result =
let open Zulip.Jsonu_syntax in
(Zulip.Jsonu.with_object "user" @@ fun fields ->
let* user_id = (field fields "user_id" int) <|> (field fields "id" int) in
···
let reaction_type t = t.reaction_type
let user_id t = t.user_id
-
let of_json (json : Zulip.Zerror.json) : (t, Zulip.Zerror.t) result =
+
let of_json (json : Zulip.json) : (t, Zulip.zerror) result =
let open Zulip.Jsonu_syntax in
(Zulip.Jsonu.with_object "reaction" @@ fun fields ->
let* emoji_name = field fields "emoji_name" string in
···
content: string;
content_type: string;
reactions: Reaction.t list;
-
submessages: Zulip.Zerror.json list;
+
submessages: Zulip.json list;
flags: string list;
is_me_message: bool;
client: string;
···
}
| Unknown of {
common: common;
-
raw_json: Zulip.Zerror.json;
+
raw_json: Zulip.json;
}
(** Helper function to parse common fields *)
···
match parse_reaction_json r with
| Ok reaction -> Some reaction
| Error err ->
-
Log.warn (fun m -> m "Failed to parse reaction: %s" (Zulip.Zerror.message err));
+
Log.warn (fun m -> m "Failed to parse reaction: %s" (Zulip.error_message err));
None
) reactions_json
| None -> []
···
let open Zulip.Jsonu_syntax in
match parse_common json with
-
| Error err -> Error (Zulip.Zerror.message err)
+
| Error err -> Error (Zulip.error_message err)
| Ok common ->
(Zulip.Jsonu.parse_with_error "message type" @@ fun () ->
(Zulip.Jsonu.with_object "message" @@ fun fields ->
···
match parse_user_json u with
| Ok user -> Some user
| Error err ->
-
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));
None
) recipient_json in
···
| Error _ ->
Log.warn (fun m -> m "No message type field found");
Ok (Unknown { common; raw_json = json })
-
) json) |> Result.map_error Zulip.Zerror.message
+
) json) |> Result.map_error Zulip.error_message
(** Accessor functions *)
let get_common = function
+7 -7
stack/zulip/lib/zulip_bot/lib/message.mli
···
val email : t -> string
val full_name : t -> string
val short_name : t -> string option
-
val of_json : Zulip.Zerror.json -> (t, Zulip.Zerror.t) result
+
val of_json : Zulip.json -> (t, Zulip.zerror) result
end
(** Reaction representation *)
···
val emoji_code : t -> string
val reaction_type : t -> string
val user_id : t -> int
-
val of_json : Zulip.Zerror.json -> (t, Zulip.Zerror.t) result
+
val of_json : Zulip.json -> (t, Zulip.zerror) result
end
(** Common message fields *)
···
content: string;
content_type: string;
reactions: Reaction.t list;
-
submessages: Zulip.Zerror.json list;
+
submessages: Zulip.json list;
flags: string list;
is_me_message: bool;
client: string;
···
}
| Unknown of {
common: common;
-
raw_json: Zulip.Zerror.json;
+
raw_json: Zulip.json;
}
(** Accessor functions *)
···
val content : t -> string
val content_type : t -> string
val reactions : t -> Reaction.t list
-
val submessages : t -> Zulip.Zerror.json list
+
val submessages : t -> Zulip.json list
val flags : t -> string list
val is_me_message : t -> bool
val client : t -> string
···
val parse_command : t -> (string * string list) option
(** JSON parsing *)
-
val of_json : Zulip.Zerror.json -> (t, string) result
+
val of_json : Zulip.json -> (t, string) result
(** Pretty printing *)
val pp : Format.formatter -> t -> unit
···
val pp_ansi : ?show_json:bool -> Format.formatter -> t -> unit
(** Pretty print JSON for debugging *)
-
val pp_json_debug : Format.formatter -> Zulip.Zerror.json -> unit
+
val pp_json_debug : Format.formatter -> Zulip.json -> unit
+4 -4
stack/zulip/lib/zulip_botserver/lib/bot_registry.mli
···
val create :
name:string ->
handler:(module Zulip_bot.Bot_handler.Bot_handler) ->
-
create_config:(Server_config.Bot_config.t -> (Zulip_bot.Bot_config.t, Zulip.Zerror.t) result) ->
+
create_config:(Server_config.Bot_config.t -> (Zulip_bot.Bot_config.t, Zulip.zerror) result) ->
t
val name : t -> string
-
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
end
type t
···
val get_bot : t -> email:string -> Zulip_bot.Bot_handler.t option
(** Load a bot module from file *)
-
val load_from_file : string -> (Bot_module.t, Zulip.Zerror.t) result
+
val load_from_file : string -> (Bot_module.t, Zulip.zerror) result
(** Load bot modules from directory *)
-
val load_from_directory : string -> (Bot_module.t list, Zulip.Zerror.t) result
+
val load_from_directory : string -> (Bot_module.t list, Zulip.zerror) result
(** List all registered bot emails *)
val list_bots : t -> string list
+2 -2
stack/zulip/lib/zulip_botserver/lib/bot_server.mli
···
val create :
config:Server_config.t ->
registry:Bot_registry.t ->
-
(t, Zulip.Zerror.t) result
+
(t, Zulip.zerror) result
(** Start the bot server *)
val run : t -> unit
···
config:Server_config.t ->
registry:Bot_registry.t ->
(t -> 'a) ->
-
('a, Zulip.Zerror.t) result
+
('a, Zulip.zerror) result
+2 -2
stack/zulip/lib/zulip_botserver/lib/server_config.mli
···
unit ->
t
-
val from_file : string -> (t, Zulip.Zerror.t) result
-
val from_env : unit -> (t, Zulip.Zerror.t) result
+
val from_file : string -> (t, Zulip.zerror) result
+
val from_env : unit -> (t, Zulip.zerror) result
val host : t -> string
val port : t -> int
+4 -4
stack/zulip/lib/zulip_botserver/lib/webhook_handler.mli
···
val create :
bot_email:string ->
token:string ->
-
message:Zulip.Zerror.json ->
+
message:Zulip.json ->
trigger:trigger ->
t
val bot_email : t -> string
val token : t -> string
-
val message : t -> Zulip.Zerror.json
+
val message : t -> Zulip.json
val trigger : t -> trigger
val pp : Format.formatter -> t -> unit
end
(** Parse webhook data from HTTP request *)
-
val parse_webhook : string -> (Webhook_event.t, Zulip.Zerror.t) result
+
val parse_webhook : string -> (Webhook_event.t, Zulip.zerror) result
(** Process webhook with bot registry *)
val handle_webhook :
Bot_registry.t ->
Webhook_event.t ->
-
(Zulip_bot.Bot_handler.Response.t option, Zulip.Zerror.t) result
+
(Zulip_bot.Bot_handler.Response.t option, Zulip.zerror) result
(** Validate webhook token *)
val validate_token : Server_config.Bot_config.t -> string -> bool