diff options
| author | Adelyn Breedlove <[email protected]> | 2018-12-15 18:02:29 +0000 |
|---|---|---|
| committer | Adelyn Breedlove <[email protected]> | 2018-12-15 18:02:29 +0000 |
| commit | 910ce60bba69b961c82e29ff1bb63bf4d3fe5519 (patch) | |
| tree | 690861418bed15de47e7cf5672d96fdacc9abe5e | |
| parent | Merge branch 'patch-1' into 'master' (diff) | |
| parent | Merging (diff) | |
| download | disml-910ce60bba69b961c82e29ff1bb63bf4d3fe5519.tar.xz disml-910ce60bba69b961c82e29ff1bb63bf4d3fe5519.zip | |
Merge branch 'dev' into 'master'
Merge first semi-usable state of dev-branch in a while
See merge request Mishio595/disml!10
118 files changed, 14067 insertions, 1131 deletions
@@ -10,10 +10,11 @@ This is being actively developed and is definitely still in the early stages. Wh * Rudimentary gateway support * Automatic sharding * Event dispatch to a user-defined consumer +* Automatic reconnection of dropped gateway connections +* Automatic rate limit handling #### What is not implemented? -* Abstractions for Discord Objects (Message, Guild, Channel, etc) -* Automatic reconnection of dropped gateway connections +* Abstractions for Discord Objects (Message, Guild, Channel, etc) (**IN PROGRESS!**) * Voice * Cache @@ -22,4 +23,4 @@ In order to get started you'll first need to install OCaml (of course). I recomm I currently don't provide an opam build file nor is the project uploaded to opam. This will happen with the first stable release. -You'll find an example bot in /bin directory.
\ No newline at end of file +You'll find an example bot in /bin directory. @@ -1,41 +1,21 @@ open Async open Core -open Disml -let hook_events client = - Client.on "MESSAGE_CREATE" client (fun msg -> - let msg_time = Time.(to_span_since_epoch @@ now ()) in - let content = Yojson.Basic.Util.(member "content" msg |> to_string) in - let channel = Yojson.Basic.Util.(member "channel_id" msg |> to_string) in - if String.is_prefix ~prefix:"!?ping" content then - Http.create_message channel @@ `Assoc [ - ("content", `String "Pong!"); - ("tts", `Bool false); - ] - >>> fun resp -> - let message_id = Yojson.Basic.Util.(member "id" resp |> to_string) in - let rtt = Time.(to_span_since_epoch @@ sub (now ()) msg_time) in - Http.edit_message channel message_id @@ `Assoc [ - ("content", `String ("Pong! `" ^ (Float.to_string @@ Time.Span.to_ms rtt) ^ " ms`")); - ] - >>> fun _ -> print_endline "Message Edited!" - ); - Client.on "GUILD_CREATE" client (fun guild -> print_endline Yojson.Basic.Util.(member "name" guild |> to_string)) +module Client = Disml.Client.Make(struct + let token = match Sys.getenv "DISCORD_TOKEN" with + | Some t -> t + | None -> failwith "No token in env" +end)(Handler) let main () = - let token = match Sys.getenv "DISCORD_TOKEN" with - | Some s -> s - | None -> failwith "No token" - in - let client = Client.make token in - hook_events client; - Client.start client + Client.start () >>> fun client -> Clock.every (Time.Span.create ~sec:60 ()) (fun () -> - Client.set_status_with client (fun shard -> `String ("Current seq: " ^ (Int.to_string shard.seq))) - |> ignore) + print_endline "Setting status"; + Client.set_status ~status:(`String "Hello!") client + >>> ignore) let _ = - Scheduler.go_main ~main ()
\ No newline at end of file + Scheduler.go_main ~main () diff --git a/bin/handler.ml b/bin/handler.ml new file mode 100644 index 0000000..74eaefb --- /dev/null +++ b/bin/handler.ml @@ -0,0 +1,47 @@ +module Make(Models : Disml.S.Models) = struct + open Core + open Async + open Models + open Disml.Event + + let check_command (msg:Disml.Message_t.t) = + if String.is_prefix ~prefix:"!ping" msg.content then + Message.reply msg "Hello!" >>> ignore + + let handle_event = function + | HELLO _ -> print_endline "Received HELLO" + | READY _ -> print_endline "Received READY" + | RESUMED _ -> print_endline "Received RESUMED" + | INVALID_SESSION _ -> print_endline "Received INVALID_SESSION" + | CHANNEL_CREATE _ -> print_endline "Received CHANNEL_CREATE" + | CHANNEL_UPDATE _ -> print_endline "Received CHANNEL_UPDATE" + | CHANNEL_DELETE _ -> print_endline "Received CHANNEL_DELETE" + | CHANNEL_PINS_UPDATE _ -> print_endline "Received CHANNEL_PINS_UPDATE" + | GUILD_CREATE _ -> print_endline "Received GUILD_CREATE" + | GUILD_UPDATE _ -> print_endline "Received GUILD_UPDATE" + | GUILD_DELETE _ -> print_endline "Received GUILD_DELETE" + | GUILD_BAN_ADD _ -> print_endline "Received GUILD_BAN_ADD" + | GUILD_BAN_REMOVE _ -> print_endline "Received GUILD_BAN_REMOVE" + | GUILD_EMOJIS_UPDATE _ -> print_endline "Received GUILD_EMOJIS_UPDATE" + | GUILD_INTEGRATIONS_UPDATE _ -> print_endline "Received GUILD_INTEGRATIONS_UPDATE" + | GUILD_MEMBER_ADD _ -> print_endline "Received GUILD_MEMBER_ADD" + | GUILD_MEMBER_REMOVE _ -> print_endline "Received GUILD_MEMBER_REMOVE" + | GUILD_MEMBER_UPDATE _ -> print_endline "Received GUILD_MEMBER_UPDATE" + | GUILD_MEMBERS_CHUNK _ -> print_endline "Received GUILD_MEMBERS_CHUNK" + | GUILD_ROLE_CREATE _ -> print_endline "Received GUILD_ROLE_CREATE" + | GUILD_ROLE_UPDATE _ -> print_endline "Received GUILD_ROLE_UPDATE" + | GUILD_ROLE_DELETE _ -> print_endline "Received GUILD_ROLE_DELETE" + | MESSAGE_CREATE msg -> check_command msg; print_endline "Received MESSAGE_CREATE" + | MESSAGE_UPDATE _ -> print_endline "Received MESSAGE_UPDATE" + | MESSAGE_DELETE _ -> print_endline "Received MESSAGE_DELETE" + | MESSAGE_BULK_DELETE _ -> print_endline "Received MESSAGE_BULK_DELETE" + | MESSAGE_REACTION_ADD _ -> print_endline "Received MESSAGE_REACTION_ADD" + | MESSAGE_REACTION_REMOVE _ -> print_endline "Received MESSAGE_REACTION_REMOVE" + | MESSAGE_REACTION_REMOVE_ALL _ -> print_endline "Received MESSAGE_REACTION_REMOVE_ALL" + | PRESENCE_UPDATE _ -> print_endline "Received PRESENCE_UPDATE" + | TYPING_START _ -> print_endline "Received TYPING_START" + | USER_UPDATE _ -> print_endline "Received USER_UPDATE" + | VOICE_STATE_UPDATE _ -> print_endline "Received VOICE_STATE_UPDATE" + | VOICE_SERVER_UPDATE _ -> print_endline "Received VOICE_SERVER_UPDATE" + | WEBHOOKS_UPDATE _ -> print_endline "Received WEBHOOKS_UPDATE" +end
\ No newline at end of file diff --git a/disml.install b/disml.install new file mode 100644 index 0000000..f80895d --- /dev/null +++ b/disml.install @@ -0,0 +1,4 @@ +lib: [ + "_build/install/default/lib/disml/META" {"META"} + "_build/install/default/lib/disml/opam" {"opam"} +] diff --git a/disml.opam b/disml.opam new file mode 100644 index 0000000..cf9c4cc --- /dev/null +++ b/disml.opam @@ -0,0 +1,15 @@ +opam-version: "2.0" +name: "disml" +version: "~dev" +synopsis: ""An OCaml library for interfacing with the Discord API"" +maintainer: "Adelyn Breedlove <[email protected]>" +authors: "Adelyn Breedlove <[email protected]>" +license: "MIT" +homepage: "https://gitlab.com/Mishio595/disml" +bug-reports: "https://gitlab.com/Mishio595/disml/issues" +build: [ + ["dune" "subst"] {pinned} + ["dune" "build" "-p" name "-j" jobs] +] +install: [dune install disml] +dev-repo: "git+https://gitlab.com/Mishio595/disml"
\ No newline at end of file @@ -1,14 +1,42 @@ (library (name disml) - (modules endpoints http client sharder opcode) - (libraries core async_ssl cohttp-async yojson websocket-async zlib) + (public_name disml) + (synopsis "An OCaml library for interfacing with the Discord API") + (modules + activity activity_t activity_j + attachment attachment_t attachment_j + ban ban_t ban_j + channel channel_t channel_j + embed embed_t embed_j + emoji emoji_t emoji_j + guild guild_t guild_j + member member_t member_j + message message_t message_j + presence presence_t presence_j + reaction reaction_t reaction_j + role role_t role_j + snowflake snowflake_t snowflake_j + user user_t user_j + client + dispatch + endpoints + event + http + models + opcode + rl + s + sharder + ) + (libraries core async_ssl cohttp-async yojson websocket-async zlib atdgen) + ;(preprocess (pps ppx_jane)) ) ; Test executable (executable - (name bot) - (modules bot) - (libraries core async disml) + (name bot) + (modules bot handler) + (libraries core async_ssl disml) ) -(include_subdirs unqualified)
\ No newline at end of file +(include_subdirs unqualified) diff --git a/generate_json.sh b/generate_json.sh new file mode 100644 index 0000000..a9c497b --- /dev/null +++ b/generate_json.sh @@ -0,0 +1,7 @@ +# Helper script for running atdgen + +for filename in ./lib/models/gen/*.atd; do + [ -e "$filename" ] || continue + atdgen -t $filename + atdgen -j $filename +done
\ No newline at end of file diff --git a/lib/client.ml b/lib/client.ml new file mode 100644 index 0000000..229c9cc --- /dev/null +++ b/lib/client.ml @@ -0,0 +1,30 @@ +open Async + +module Make(T : S.Token)(H : S.Handler_f) = struct + include T + + module Http = Http.Make(T) + module Models = Models.Make(Http) + module Handler = H.Make(Models) + module Dispatch = Dispatch.Make(Handler) + module Sharder = Sharder.Make(Http)(Dispatch) + + type t = { + sharder: Sharder.t; + token: string; + } + + let start ?count () = + Sharder.start ?count () + >>| fun sharder -> + { sharder; token; } + + let set_status ~status client = + Sharder.set_status ~status client.sharder + + let set_status_with ~f client = + Sharder.set_status_with ~f client.sharder + + let request_guild_members ~guild ?query ?limit client = + Sharder.request_guild_members ~guild ?query ?limit client.sharder +end
\ No newline at end of file diff --git a/lib/client/client.ml b/lib/client/client.ml deleted file mode 100644 index 9877714..0000000 --- a/lib/client/client.ml +++ /dev/null @@ -1,116 +0,0 @@ -open Async - -type t = { - sharder: Sharder.t Ivar.t; - (* events: (Events.t, Core_kernel.write) Bvar.t list; *) - mutable handler: Sharder.handler; - token: string; -} - -let make ?handler token = - let handler = match handler with - | Some h -> h - | None -> begin - Sharder.{ - ready = None; - resumed = None; - channel_create = None; - channel_delete = None; - channel_update = None; - channel_pins_update = None; - guild_create = None; - guild_delete = None; - guild_update = None; - guild_ban_add = None; - guild_ban_remove = None; - guild_emojis_update = None; - guild_integrations_update = None; - guild_member_add = None; - guild_member_remove = None; - guild_member_update = None; - guild_members_chunk = None; - guild_role_create = None; - guild_role_delete = None; - guild_role_update = None; - message_create = None; - message_delete = None; - message_update = None; - message_delete_bulk = None; - message_reaction_add = None; - message_reaction_remove = None; - message_reaction_remove_all = None; - presence_update = None; - typing_start = None; - user_update = None; - voice_state_update = None; - voice_server_update = None; - webhooks_update = None; - } - end in - { - sharder = Ivar.create (); - handler; - token; - } - -let start ?count client = - Sharder.start ?count ~handler:client.handler client.token - >>| fun sharder -> - Ivar.fill_if_empty client.sharder sharder; - client - -let on ev client fn = - client.handler <- (match ev with - | "READY" -> { client.handler with ready = Some(fn) } - | "RESUMED" -> { client.handler with resumed = Some(fn) } - | "CHANNEL_CREATE" -> { client.handler with channel_create = Some(fn) } - | "CHANNEL_DELETE" -> { client.handler with channel_delete = Some(fn) } - | "CHANNEL_UPDATE" -> { client.handler with channel_update = Some(fn) } - | "CHANNEL_PINS_UPDATE" -> { client.handler with channel_pins_update = Some(fn) } - | "GUILD_CREATE" -> { client.handler with guild_create = Some(fn) } - | "GUILD_DELETE" -> { client.handler with guild_delete = Some(fn) } - | "GUILD_UPDATE" -> { client.handler with guild_update = Some(fn) } - | "GUILD_BAN_ADD" -> { client.handler with guild_ban_add = Some(fn) } - | "GUILD_BAN_REMOVE" -> { client.handler with guild_ban_remove = Some(fn) } - | "GUILD_EMOJIS_UPDATE" -> { client.handler with guild_emojis_update = Some(fn) } - | "GUILD_INTEGRATIONS_UPDATE" -> { client.handler with guild_integrations_update = Some(fn) } - | "GUILD_MEMBER_ADD" -> { client.handler with guild_member_add = Some(fn) } - | "GUILD_MEMBER_REMOVE" -> { client.handler with guild_member_remove = Some(fn) } - | "GUILD_MEMBER_UPDATE" -> { client.handler with guild_member_update = Some(fn) } - | "GUILD_MEMBERS_CHUNK" -> { client.handler with guild_members_chunk = Some(fn) } - | "GUILD_ROLE_CREATE" -> { client.handler with guild_role_create = Some(fn) } - | "GUILD_ROLE_DELETE" -> { client.handler with guild_role_delete = Some(fn) } - | "GUILD_ROLE_UPDATE" -> { client.handler with guild_role_update = Some(fn) } - | "MESSAGE_CREATE" -> { client.handler with message_create = Some(fn) } - | "MESSAGE_DELETE" -> { client.handler with message_delete = Some(fn) } - | "MESSAGE_UPDATE" -> { client.handler with message_update = Some(fn) } - | "MESSAGE_DELETE_BULK" -> { client.handler with message_delete_bulk = Some(fn) } - | "MESSAGE_REACTION_ADD" -> { client.handler with message_reaction_add = Some(fn) } - | "MESSAGE_REACTION_REMOVE" -> { client.handler with message_reaction_remove = Some(fn) } - | "MESSAGE_REACTION_REMOVE_ALL" -> { client.handler with message_reaction_remove_all = Some(fn) } - | "PRESENCE_UPDATE" -> { client.handler with presence_update = Some(fn) } - | "TYPING_START" -> { client.handler with typing_start = Some(fn) } - | "USER_UPDATE" -> { client.handler with user_update = Some(fn) } - | "VOICE_STATE_UPDATE" -> { client.handler with voice_state_update = Some(fn) } - | "VOICE_SERVER_UPDATE" -> { client.handler with voice_server_update = Some(fn) } - | "WEBHOOKS_UPDATE" -> { client.handler with webhooks_update = Some(fn) } - | _ -> client.handler); - match Ivar.peek client.sharder with - | Some s -> Sharder.update_handler s client.handler; - | None -> () - - -let set_status client status = - Ivar.read client.sharder - >>= fun sharder -> - Sharder.set_status sharder status - -let set_status_with client f = - Ivar.read client.sharder - >>= fun sharder -> - Sharder.set_status_with sharder f - -let request_guild_members ~guild ?query ?limit client = - Ivar.read client.sharder - >>= fun sharder -> - Sharder.request_guild_members ~guild ?query ?limit sharder
\ No newline at end of file diff --git a/lib/client/sharder.ml b/lib/client/sharder.ml deleted file mode 100644 index 8d735b0..0000000 --- a/lib/client/sharder.ml +++ /dev/null @@ -1,466 +0,0 @@ -open Async -open Core -open Websocket_async - -exception Invalid_Payload - -type handler = { - ready: (Yojson.Basic.json -> unit) option; - resumed: (Yojson.Basic.json -> unit) option; - channel_create: (Yojson.Basic.json -> unit) option; - channel_delete: (Yojson.Basic.json -> unit) option; - channel_update: (Yojson.Basic.json -> unit) option; - channel_pins_update: (Yojson.Basic.json -> unit) option; - guild_create: (Yojson.Basic.json -> unit) option; - guild_delete: (Yojson.Basic.json -> unit) option; - guild_update: (Yojson.Basic.json -> unit) option; - guild_ban_add: (Yojson.Basic.json -> unit) option; - guild_ban_remove: (Yojson.Basic.json -> unit) option; - guild_emojis_update: (Yojson.Basic.json -> unit) option; - guild_integrations_update: (Yojson.Basic.json -> unit) option; - guild_member_add: (Yojson.Basic.json -> unit) option; - guild_member_remove: (Yojson.Basic.json -> unit) option; - guild_member_update: (Yojson.Basic.json -> unit) option; - guild_members_chunk: (Yojson.Basic.json -> unit) option; (* Not sure if this should be exposed *) - guild_role_create: (Yojson.Basic.json -> unit) option; - guild_role_delete: (Yojson.Basic.json -> unit) option; - guild_role_update: (Yojson.Basic.json -> unit) option; - message_create: (Yojson.Basic.json -> unit) option; - message_delete: (Yojson.Basic.json -> unit) option; - message_update: (Yojson.Basic.json -> unit) option; - message_delete_bulk: (Yojson.Basic.json -> unit) option; - message_reaction_add: (Yojson.Basic.json -> unit) option; - message_reaction_remove: (Yojson.Basic.json -> unit) option; - message_reaction_remove_all: (Yojson.Basic.json -> unit) option; - presence_update: (Yojson.Basic.json -> unit) option; - typing_start: (Yojson.Basic.json -> unit) option; - user_update: (Yojson.Basic.json -> unit) option; - voice_state_update: (Yojson.Basic.json -> unit) option; - voice_server_update: (Yojson.Basic.json -> unit) option; - webhooks_update: (Yojson.Basic.json -> unit) option; -} - -module Shard = struct - type t = { - mutable hb: unit Ivar.t option; - mutable seq: int; - mutable session: string option; - mutable handler: handler; - token: string; - shard: int * int; - write: string Pipe.Writer.t; - read: string Pipe.Reader.t; - ready: unit Ivar.t; - } - - let identify_lock = Mutex.create () - - let parse frame = - match frame with - | `Ok s -> Yojson.Basic.from_string s - | `Eof -> raise Invalid_Payload (* This needs to go into reconnect code, or stop using client_ez and handle frames manually *) - - let push_frame ?payload shard ev = - print_endline @@ "Pushing frame. OP: " ^ Opcode.to_string @@ ev; - let content = match payload with - | None -> "" - | Some p -> - Yojson.Basic.to_string @@ `Assoc [ - ("op", `Int (Opcode.to_int ev)); - ("d", p); - ] - in - Pipe.write shard.write content - >>| fun () -> - shard - - let heartbeat shard = - let seq = match shard.seq with - | 0 -> `Null - | i -> `Int i - in - let payload = `Assoc [ - ("op", `Int 1); - ("d", seq); - ] in - push_frame ~payload shard HEARTBEAT - - let dispatch shard payload = - let module J = Yojson.Basic.Util in - let seq = J.(member "s" payload |> to_int) in - shard.seq <- seq; - let t = J.(member "t" payload |> to_string) in - let data = J.member "d" payload in - let _ = match t with - | "READY" -> begin - Ivar.fill_if_empty shard.ready (); - let session = J.(member "session_id" data |> to_string) in - shard.session <- Some session; - match shard.handler.ready with - | Some f -> f data - | None -> () - end - | "RESUMED" -> begin - match shard.handler.resumed with - | Some f -> f data - | None -> () - end - | "CHANNEL_CREATE" -> begin - match shard.handler.channel_create with - | Some f -> f data - | None -> () - end - | "CHANNEL_DELETE" -> begin - match shard.handler.channel_delete with - | Some f -> f data - | None -> () - end - | "CHANNEL_UPDATE" -> begin - match shard.handler.channel_update with - | Some f -> f data - | None -> () - end - | "CHANNEL_PINS_UPDATE" -> begin - match shard.handler.channel_pins_update with - | Some f -> f data - | None -> () - end - | "GUILD_CREATE" -> begin - match shard.handler.guild_create with - | Some f -> f data - | None -> () - end - | "GUILD_DELETE" -> begin - match shard.handler.guild_delete with - | Some f -> f data - | None -> () - end - | "GUILD_UPDATE" -> begin - match shard.handler.guild_update with - | Some f -> f data - | None -> () - end - | "GUILD_BAN_ADD" -> begin - match shard.handler.guild_ban_add with - | Some f -> f data - | None -> () - end - | "GUILD_BAN_REMOVE" -> begin - match shard.handler.guild_ban_remove with - | Some f -> f data - | None -> () - end - | "GUILD_EMOJIS_UPDATE" -> begin - match shard.handler.guild_emojis_update with - | Some f -> f data - | None -> () - end - | "GUILD_INTEGRATIONS_UPDATE" -> begin - match shard.handler.guild_integrations_update with - | Some f -> f data - | None -> () - end - | "GUILD_MEMBER_ADD" -> begin - match shard.handler.guild_member_add with - | Some f -> f data - | None -> () - end - | "GUILD_MEMBER_REMOVE" -> begin - match shard.handler.guild_member_remove with - | Some f -> f data - | None -> () - end - | "GUILD_MEMBER_UPDATE" -> begin - match shard.handler.guild_member_update with - | Some f -> f data - | None -> () - end - | "GUILD_MEMBERS_CHUNK" -> begin - match shard.handler.guild_members_chunk with - | Some f -> f data - | None -> () - end - | "GUILD_ROLE_CREATE" -> begin - match shard.handler.guild_role_create with - | Some f -> f data - | None -> () - end - | "GUILD_ROLE_DELETE" -> begin - match shard.handler.guild_role_delete with - | Some f -> f data - | None -> () - end - | "GUILD_ROLE_UPDATE" -> begin - match shard.handler.guild_role_update with - | Some f -> f data - | None -> () - end - | "MESSAGE_CREATE" -> begin - match shard.handler.message_create with - | Some f -> f data - | None -> () - end - | "MESSAGE_DELETE" -> begin - match shard.handler.message_delete with - | Some f -> f data - | None -> () - end - | "MESSAGE_UPDATE" -> begin - match shard.handler.message_update with - | Some f -> f data - | None -> () - end - | "MESSAGE_DELETE_BULK" -> begin - match shard.handler.message_delete_bulk with - | Some f -> f data - | None -> () - end - | "MESSAGE_REACTION_ADD" -> begin - match shard.handler.message_reaction_add with - | Some f -> f data - | None -> () - end - | "MESSAGE_REACTION_REMOVE" -> begin - match shard.handler.message_reaction_remove with - | Some f -> f data - | None -> () - end - | "MESSAGE_REACTION_REMOVE_ALL" -> begin - match shard.handler.message_reaction_remove_all with - | Some f -> f data - | None -> () - end - | "PRESENCE_UPDATE" -> begin - match shard.handler.presence_update with - | Some f -> f data - | None -> () - end - | "TYPING_START" -> begin - match shard.handler.typing_start with - | Some f -> f data - | None -> () - end - | "USER_UPDATE" -> begin - match shard.handler.user_update with - | Some f -> f data - | None -> () - end - | "VOICE_STATE_UPDATE" -> begin - match shard.handler.voice_state_update with - | Some f -> f data - | None -> () - end - | "VOICE_SERVER_UPDATE" -> begin - match shard.handler.voice_server_update with - | Some f -> f data - | None -> () - end - | "WEBHOOKS_UPDATE" -> begin - match shard.handler.webhooks_update with - | Some f -> f data - | None -> () - end - | _ -> () - in - return shard - - let set_status shard status = - let payload = match status with - | `Assoc [("name", `String name); ("type", `Int t)] -> - `Assoc [ - ("status", `String "online"); - ("afk", `Bool false); - ("since", `Null); - ("game", `Assoc [ - ("name", `String name); - ("type", `Int t) - ]) - ] - | `String name -> - `Assoc [ - ("status", `String "online"); - ("afk", `Bool false); - ("since", `Null); - ("game", `Assoc [ - ("name", `String name); - ("type", `Int 0) - ]) - ] - | _ -> raise Invalid_Payload - in - Ivar.read shard.ready >>= fun _ -> - push_frame ~payload shard STATUS_UPDATE - - let request_guild_members ~guild ?(query="") ?(limit=0) shard = - let payload = `Assoc [ - ("guild_id", `String (string_of_int guild)); - ("query", `String query); - ("limit", `Int limit); - ] in - Ivar.read shard.ready >>= fun _ -> - push_frame ~payload shard REQUEST_GUILD_MEMBERS - - let initialize shard data = - let module J = Yojson.Basic.Util in - let hb = match shard.hb with - | None -> begin - let hb_interval = J.(member "heartbeat_interval" data |> to_int) in - let finished = Ivar.create () in - Clock.every' - ~continue_on_error:true - ~finished - (Core.Time.Span.create ~ms:hb_interval ()) - (fun () -> heartbeat shard >>= fun _ -> return ()); - finished - end - | Some s -> s - in - shard.hb <- Some hb; - Mutex.lock identify_lock; - let (cur, max) = shard.shard in - let shards = [`Int cur; `Int max] in - match shard.session with - | None -> - let payload = `Assoc [ - ("token", `String shard.token); - ("properties", `Assoc [ - ("$os", `String Sys.os_type); - ("$device", `String "dis.ml"); - ("$browser", `String "dis.ml") - ]); - ("compress", `Bool false); (* TODO add compression handling*) - ("large_threshold", `Int 250); - ("shard", `List shards); - ] in - push_frame ~payload shard IDENTIFY - | Some s -> - let payload = `Assoc [ - ("token", `String shard.token); - ("session_id", `String s); - ("seq", `Int shard.seq) - ] in - push_frame ~payload shard RESUME - >>| fun s -> - Clock.after (Core.Time.Span.create ~sec:5 ()) - >>| (fun _ -> Mutex.unlock identify_lock) - |> ignore; - s - - let handle_frame shard term = - let module J = Yojson.Basic.Util in - let op = J.(member "op" term |> to_int) - |> Opcode.from_int - in - match op with - | DISPATCH -> dispatch shard term - | HEARTBEAT -> heartbeat shard - | RECONNECT -> print_endline "OP 7"; return shard (* TODO reconnect *) - | INVALID_SESSION -> print_endline "OP 9"; return shard (* TODO invalid session *) - | HELLO -> initialize shard @@ J.member "d" term - | HEARTBEAT_ACK -> return shard - | opcode -> - print_endline @@ "Invalid Opcode:" ^ Opcode.to_string opcode; - return shard - - let create ~url ~shards ~token ~handler () = - let open Core in - let uri = (url ^ "?v=6&encoding=json") |> Uri.of_string in - let extra_headers = Http.Base.process_request_headers () in - let host = Option.value_exn ~message:"no host in uri" Uri.(host uri) in - let port = - match Uri.port uri, Uri_services.tcp_port_of_uri uri with - | Some p, _ -> p - | None, Some p -> p - | _ -> 443 in - let scheme = Option.value_exn ~message:"no scheme in uri" Uri.(scheme uri) in - let tcp_fun (r,w) = - let (read, write) = client_ez - ~extra_headers - uri r w - in - let rec ev_loop shard = - Pipe.read read - >>= fun frame -> - handle_frame shard @@ parse frame - >>= fun shard -> - ev_loop shard - in - let shard = { - read; - write; - handler; - ready = Ivar.create (); - hb = None; - seq = 0; - shard = shards; - session = None; - token = token; - } - in - ev_loop shard |> ignore; - return shard - in - match Unix.getaddrinfo host (string_of_int port) [] with - | [] -> failwithf "DNS resolution failed for %s" host () - | { ai_addr; _ } :: _ -> - let addr = - match scheme, ai_addr with - | _, ADDR_UNIX path -> `Unix_domain_socket path - | "https", ADDR_INET (h, p) - | "wss", ADDR_INET (h, p) -> - let h = Ipaddr_unix.of_inet_addr h in - `OpenSSL (h, p, Conduit_async.V2.Ssl.Config.create ()) - | _, ADDR_INET (h, p) -> - let h = Ipaddr_unix.of_inet_addr h in - `TCP (h, p) - in - Conduit_async.V2.connect addr >>= tcp_fun -end - -type t = { - shards: Shard.t list; -} - -let start ?count ~handler token = - let module J = Yojson.Basic.Util in - Http.get_gateway_bot () >>= fun data -> - let url = J.(member "url" data |> to_string) in - let count = match count with - | Some c -> c - | None -> J.(member "shards" data |> to_int) - in - let shard_list = (0, count) in - let rec gen_shards l a = - match l with - | (id, total) when id >= total -> return a - | (id, total) -> - Shard.create ~url ~shards:(id, total) ~token ~handler () - >>= fun shard -> - let a = shard :: a in - gen_shards (id+1, total) a - in - gen_shards shard_list [] - >>| fun shards -> - { - shards; - } - -let set_status sharder status = - Deferred.all @@ List.map ~f:(fun shard -> - Shard.set_status shard status - ) sharder.shards - -let set_status_with sharder f = - Deferred.all @@ List.map ~f:(fun shard -> - Shard.set_status shard @@ f shard - ) sharder.shards - -let request_guild_members ~guild ?query ?limit sharder = - Deferred.all @@ List.map ~f:(fun shard -> - Shard.request_guild_members ~guild ?query ?limit shard - ) sharder.shards - -let update_handler sharder handler = - List.iter ~f:(fun shard -> - shard.handler <- handler - ) sharder.shards
\ No newline at end of file diff --git a/lib/client/sharder.mli b/lib/client/sharder.mli deleted file mode 100644 index 0fd16d6..0000000 --- a/lib/client/sharder.mli +++ /dev/null @@ -1,138 +0,0 @@ -open Async - -(** -Record type for registering event handlers -*) -type handler = { - ready: (Yojson.Basic.json -> unit) option; - resumed: (Yojson.Basic.json -> unit) option; - channel_create: (Yojson.Basic.json -> unit) option; - channel_delete: (Yojson.Basic.json -> unit) option; - channel_update: (Yojson.Basic.json -> unit) option; - channel_pins_update: (Yojson.Basic.json -> unit) option; - guild_create: (Yojson.Basic.json -> unit) option; - guild_delete: (Yojson.Basic.json -> unit) option; - guild_update: (Yojson.Basic.json -> unit) option; - guild_ban_add: (Yojson.Basic.json -> unit) option; - guild_ban_remove: (Yojson.Basic.json -> unit) option; - guild_emojis_update: (Yojson.Basic.json -> unit) option; - guild_integrations_update: (Yojson.Basic.json -> unit) option; - guild_member_add: (Yojson.Basic.json -> unit) option; - guild_member_remove: (Yojson.Basic.json -> unit) option; - guild_member_update: (Yojson.Basic.json -> unit) option; - guild_members_chunk: (Yojson.Basic.json -> unit) option; - guild_role_create: (Yojson.Basic.json -> unit) option; - guild_role_delete: (Yojson.Basic.json -> unit) option; - guild_role_update: (Yojson.Basic.json -> unit) option; - message_create: (Yojson.Basic.json -> unit) option; - message_delete: (Yojson.Basic.json -> unit) option; - message_update: (Yojson.Basic.json -> unit) option; - message_delete_bulk: (Yojson.Basic.json -> unit) option; - message_reaction_add: (Yojson.Basic.json -> unit) option; - message_reaction_remove: (Yojson.Basic.json -> unit) option; - message_reaction_remove_all: (Yojson.Basic.json -> unit) option; - presence_update: (Yojson.Basic.json -> unit) option; - typing_start: (Yojson.Basic.json -> unit) option; - user_update: (Yojson.Basic.json -> unit) option; - voice_state_update: (Yojson.Basic.json -> unit) option; - voice_server_update: (Yojson.Basic.json -> unit) option; - webhooks_update: (Yojson.Basic.json -> unit) option; -} - -(** -Represents a single Shard. Manual creation is discouraged; use Sharder.start instead -*) -module Shard : sig - type t = { - mutable hb: unit Ivar.t option; - mutable seq: int; - mutable session: string option; - mutable handler: handler; - token: string; - shard: int * int; - write: string Pipe.Writer.t; - read: string Pipe.Reader.t; - ready: unit Ivar.t; - } - - val parse : - [< `Ok of string | `Eof] -> - Yojson.Basic.json - - val push_frame : - ?payload:Yojson.Basic.json -> - t -> - Opcode.t -> - t Deferred.t - - val heartbeat : - t -> - t Deferred.t - - val dispatch : - t -> - Yojson.Basic.json -> - t Deferred.t - - val set_status : - t -> - Yojson.Basic.json -> - t Deferred.t - - val request_guild_members : - guild:int -> - ?query:string -> - ?limit:int -> - t -> - t Deferred.t - - val initialize : - t -> - Yojson.Basic.json -> - t Deferred.t - - val handle_frame : - t -> - Yojson.Basic.json -> - t Deferred.t - - val create : - url:string -> - shards:int * int -> - token:string -> - handler: handler -> - unit -> - t Deferred.t -end - -type t = { - shards: Shard.t list; -} - -val start : - ?count:int -> - handler:handler -> - string -> - t Deferred.t - -val set_status : - t -> - Yojson.Basic.json -> - Shard.t list Deferred.t - -val set_status_with : - t -> - (Shard.t -> Yojson.Basic.json) -> - Shard.t list Deferred.t - -val request_guild_members : - guild:int -> - ?query:string -> - ?limit:int -> - t -> - Shard.t list Deferred.t - -val update_handler : - t -> - handler -> - unit
\ No newline at end of file diff --git a/lib/dis.ml b/lib/dis.ml deleted file mode 100644 index e69de29..0000000 --- a/lib/dis.ml +++ /dev/null diff --git a/lib/dispatch.ml b/lib/dispatch.ml new file mode 100644 index 0000000..c38afe2 --- /dev/null +++ b/lib/dispatch.ml @@ -0,0 +1,6 @@ +module Make(H : S.Handler) : S.Dispatch = struct + let dispatch ~ev contents = + print_endline (Yojson.Safe.prettify contents); + Event.event_of_string ~contents ev + |> H.handle_event +end
\ No newline at end of file diff --git a/lib/dispatch.mli b/lib/dispatch.mli new file mode 100644 index 0000000..100a34b --- /dev/null +++ b/lib/dispatch.mli @@ -0,0 +1 @@ +module Make(H : S.Handler) : S.Dispatch
\ No newline at end of file diff --git a/lib/endpoints.ml b/lib/endpoints.ml index 4fc2d1a..12563b0 100644 --- a/lib/endpoints.ml +++ b/lib/endpoints.ml @@ -1,96 +1,62 @@ +open Printf + let gateway = "/gateway" let gateway_bot = "/gateway/bot" - -let channel channel_id = "/channels/"^channel_id -let channel_messages channel_id = "/channels/"^channel_id^"/messages" - -let channel_message channel_id msg_id = - "/channels/"^channel_id^"/messages/"^msg_id - -let channel_reaction_me channel_id msg_id emoji = - "/channels/"^channel_id^"/messages/"^msg_id^"/reactions/"^emoji^"/@me" - -let channel_reaction channel_id msg_id emoji user_id = - "/channels/"^channel_id^"/messages/"^msg_id^"/reactions/"^emoji^"/"^user_id - -let channel_reactions_get channel_id msg_id emoji = - "/channels/"^channel_id^"/messages/"^msg_id^"/reactions/"^emoji - -let channel_reactions_delete channel_id msg_id = - "/channels/"^channel_id^"/messages/"^msg_id^"/reactions" - -let channel_bulk_delete channel_id = "/channels/"^channel_id - -let channel_permission channel_id overwrite_id = - "/channels/"^channel_id^"/permissions/"^overwrite_id - -let channel_permissions channel_id = "/channels"^channel_id^"/permissions" +let channel = sprintf "/channels/%d" +let channel_messages = sprintf "/channels/%d/messages" +let channel_message = sprintf "/channels/%d/messages/%d" +let channel_reaction_me = sprintf "/channels/%d/messages/%d/reactions/%s/@me" +let channel_reaction = sprintf "/channels/%d/messages/%d/reactions/%s/%d" +let channel_reactions_get = sprintf "/channels/%d/messages/%d/reactions/%s" +let channel_reactions_delete = sprintf "/channels/%d/messages/%d/reactions" +let channel_bulk_delete = sprintf "/channels/%d" +let channel_permission = sprintf "/channels/%d/permissions/%d" +let channel_permissions = sprintf "/channels/%d/permissions" let channels = "/channels" -let channel_call_ring channel_id = "/channels/"^channel_id^"/call/ring" -let channel_invites channel_id = "/channels/"^channel_id^"/invites" -let channel_typing channel_id = "/channels/"^channel_id^"/typing" -let channel_pins channel_id = "/channels/"^channel_id^"/pins" -let channel_pin channel_id msg_id = "/channels/"^channel_id^"/pins/"^msg_id - +let channel_call_ring = sprintf "/channels/%d/call/ring" +let channel_invites = sprintf "/channels/%d/invites" +let channel_typing = sprintf "/channels/%d/typing" +let channel_pins = sprintf "/channels/%d/pins" +let channel_pin = sprintf "/channels/%d/pins/%d" let guilds = "/guilds" -let guild guild_id = "/guilds/"^guild_id -let guild_channels guild_id = "/guilds/"^guild_id^"/channels" -let guild_members guild_id = "/guilds/"^guild_id^"/members" -let guild_member guild_id user_id = "/guilds/"^guild_id^"/members/"^user_id - -let guild_member_role guild_id user_id role_id = - "/guilds/"^guild_id^"/members/"^user_id^"/roles/"^role_id - -let guild_bans guild_id = "/guilds/"^guild_id^"/bans" -let guild_ban guild_id user_id = "/guilds/"^guild_id^"/bans"^user_id -let guild_roles guild_id = "/guilds/"^guild_id^"/roles" -let guild_role guild_id role_id = "/guilds/"^guild_id^"/roles"^role_id -let guild_prune guild_id = "/guilds/"^guild_id^"/prune" -let guild_voice_regions guild_id = "/guilds/"^guild_id^"/regions" -let guild_invites guild_id = "/guilds/"^guild_id^"/invites" -let guild_integrations guild_id = "/guilds/"^guild_id^"/integrations" - -let guild_integration guild_id integration_id = - "/guilds/"^guild_id^"/integrations/"^integration_id - -let guild_integration_sync guild_id integration_id = - "/guilds/"^guild_id^"/integrations/"^integration_id^"/sync" - -let guild_embed guild_id = "/guilds/"^guild_id^"/embed" -let guild_emojis guild_id = "/guilds/"^guild_id^"/emojis" -let guild_emoji guild_id emoji_id = "/guilds/"^guild_id^"/emojis/"^emoji_id - -let webhooks_guild guild_id = "/guilds/"^guild_id^"/webhooks" -let webhooks_channel channel_id = "/channels/"^channel_id^"/webhooks" -let webhook webhook_id = "/webhooks/"^webhook_id -let webhook_token webhook_id token = "/webhooks/"^webhook_id^"/"^token - -let webhook_git webhook_id token = - "/webhooks/"^webhook_id^"/"^token^"/github" - -let webhook_slack webhook_id token = - "/webhooks/"^webhook_id^"/"^token^"/slack" - -let user user_id = "/users/"^user_id - +let guild = sprintf "/guilds/%d" +let guild_channels = sprintf "/guilds/%d/channels" +let guild_members = sprintf "/guilds/%d/members" +let guild_member = sprintf "/guilds/%d/members/%d" +let guild_member_role = sprintf "/guilds/%d/members/%d/roles/%d" +let guild_bans = sprintf "/guilds/%d/bans" +let guild_ban = sprintf "/guilds/%d/bans/%d" +let guild_roles = sprintf "/guilds/%d/roles" +let guild_role = sprintf "/guilds/%d/roles/%d" +let guild_prune = sprintf "/guilds/%d/prune" +let guild_voice_regions = sprintf "/guilds/%d/regions" +let guild_invites = sprintf "/guilds/%d/invites" +let guild_integrations = sprintf "/guilds/%d/integrations" +let guild_integration = sprintf "/guilds/%d/integrations/%d" +let guild_integration_sync = sprintf "/guilds/%d/integrations/%d/sync" +let guild_embed = sprintf "/guilds/%d/embed" +let guild_emojis = sprintf "/guilds/%d/emojis" +let guild_emoji = sprintf "/guilds/%d/emojis/%d" +let webhooks_guild = sprintf "/guilds/%d/webhooks" +let webhooks_channel = sprintf "/channels/%d/webhooks" +let webhook = sprintf "/webhooks/%d" +let webhook_token = sprintf "/webhooks/%d/%s" +let webhook_git = sprintf "/webhooks/%d/%s/github" +let webhook_slack = sprintf "/webhooks/%d/%s/slack" +let user = sprintf "/users/%d" let me = "/users/@me" let me_guilds = "/users/@me/guilds" -let me_guild guild_id = "/users/@me/guilds/"^guild_id +let me_guild = sprintf "/users/@me/guilds/%d" let me_channels = "/users/@me/channels" let me_connections = "/users/@me/connections" - -let invite code = "/invites/"^code +let invite = sprintf "/invites/%s" let regions = "/voice/regions" - let application_information = "/oauth2/applications/@me" - -let group_recipient group_id user_id = "/channels/"^group_id^"/recipients/"^user_id -let guild_me_nick guild_id = "/guilds/"^guild_id^"/members/@me/nick" -let guild_vanity_url guild_id = "/guilds/"^guild_id^"/vanity-url" -let guild_audit_logs guild_id = "/guilds/"^guild_id^"/audit-logs" - -(* let cdn_avatar id avatar image_format = "/avatars/"^id^"/"^avatar^"."^image_format *) -let cdn_embed_avatar image_name = "/embed/avatars/"^image_name^".png" -let cdn_emoji id image_format = "/emojis/"^id^"."^image_format -let cdn_icon id icon image_format = "/icons/"^id^"/"^icon^"."^image_format -let cdn_avatar id splash image_format = "/splashes/"^id^"/"^splash^"."^image_format
\ No newline at end of file +let group_recipient = sprintf "/channels/%d/recipients/%d" +let guild_me_nick = sprintf "/guilds/%d/members/@me/nick" +let guild_vanity_url = sprintf "/guilds/%d/vanity-url" +let guild_audit_logs = sprintf "/guilds/%d/audit-logs" +let cdn_embed_avatar = sprintf "/embed/avatars/%s.png" +let cdn_emoji = sprintf "/emojis/%s.%s" +let cdn_icon = sprintf "/icons/%d/%s.%s" +let cdn_avatar = sprintf "/splashes/%d/%s.%s"
\ No newline at end of file diff --git a/lib/event.ml b/lib/event.ml new file mode 100644 index 0000000..6e35c75 --- /dev/null +++ b/lib/event.ml @@ -0,0 +1,78 @@ +open Core + +type t = +| HELLO of Yojson.Safe.json +| READY of Yojson.Safe.json +| RESUMED of Yojson.Safe.json +| INVALID_SESSION of Yojson.Safe.json +| CHANNEL_CREATE of Channel_t.t +| CHANNEL_UPDATE of Channel_t.t +| CHANNEL_DELETE of Channel_t.t +| CHANNEL_PINS_UPDATE of Yojson.Safe.json +| GUILD_CREATE of Guild_t.t +| GUILD_UPDATE of Guild_t.t +| GUILD_DELETE of Guild_t.t +| GUILD_BAN_ADD of Ban_t.t +| GUILD_BAN_REMOVE of Ban_t.t +| GUILD_EMOJIS_UPDATE of Yojson.Safe.json +| GUILD_INTEGRATIONS_UPDATE of Yojson.Safe.json +| GUILD_MEMBER_ADD of Member_t.t +| GUILD_MEMBER_REMOVE of Member_t.t +| GUILD_MEMBER_UPDATE of Member_t.t +| GUILD_MEMBERS_CHUNK of Member_t.t list +| GUILD_ROLE_CREATE of Role_t.t (* * Guild.t *) +| GUILD_ROLE_UPDATE of Role_t.t (* * Guild.t *) +| GUILD_ROLE_DELETE of Role_t.t (* * Guild.t *) +| MESSAGE_CREATE of Message_t.t +| MESSAGE_UPDATE of Message_t.t +| MESSAGE_DELETE of Message_t.t +| MESSAGE_BULK_DELETE of Message_t.t list +| MESSAGE_REACTION_ADD of (* Message.t * *) Reaction_t.t +| MESSAGE_REACTION_REMOVE of (* Message.t * *) Reaction_t.t +| MESSAGE_REACTION_REMOVE_ALL of (* Message.t * *) Reaction_t.t list +| PRESENCE_UPDATE of Presence_t.t +| TYPING_START of Yojson.Safe.json +| USER_UPDATE of Yojson.Safe.json +| VOICE_STATE_UPDATE of Yojson.Safe.json +| VOICE_SERVER_UPDATE of Yojson.Safe.json +| WEBHOOKS_UPDATE of Yojson.Safe.json + +exception Invalid_event of string + +let event_of_string ~contents t = match t with + | "HELLO" -> HELLO (Yojson.Safe.from_string contents) + | "READY" -> READY (Yojson.Safe.from_string contents) + | "RESUMED" -> RESUMED (Yojson.Safe.from_string contents) + | "INVALID_SESSION" -> INVALID_SESSION (Yojson.Safe.from_string contents) + | "CHANNEL_CREATE" -> CHANNEL_CREATE (Channel_j.t_of_string contents) + | "CHANNEL_UPDATE" -> CHANNEL_UPDATE (Channel_j.t_of_string contents) + | "CHANNEL_DELETE" -> CHANNEL_DELETE (Channel_j.t_of_string contents) + | "CHANNEL_PINS_UPDATE" -> CHANNEL_PINS_UPDATE (Yojson.Safe.from_string contents) + | "GUILD_CREATE" -> GUILD_CREATE (Guild_j.t_of_string contents) + | "GUILD_UPDATE" -> GUILD_UPDATE (Guild_j.t_of_string contents) + | "GUILD_DELETE" -> GUILD_DELETE (Guild_j.t_of_string contents) + | "GUILD_BAN_ADD" -> GUILD_BAN_ADD (Ban_j.t_of_string contents) + | "GUILD_BAN_REMOVE" -> GUILD_BAN_REMOVE (Ban_j.t_of_string contents) + | "GUILD_EMOJIS_UPDATE" -> GUILD_EMOJIS_UPDATE (Yojson.Safe.from_string contents) + | "GUILD_INTEGRATIONS_UPDATE" -> GUILD_INTEGRATIONS_UPDATE (Yojson.Safe.from_string contents) + | "GUILD_MEMBER_ADD" -> GUILD_MEMBER_ADD (Member_j.t_of_string contents) + | "GUILD_MEMBER_REMOVE" -> GUILD_MEMBER_REMOVE (Member_j.t_of_string contents) + | "GUILD_MEMBER_UPDATE" -> GUILD_MEMBER_UPDATE (Member_j.t_of_string contents) + | "GUILD_MEMBERS_CHUNK" -> GUILD_MEMBERS_CHUNK (Yojson.Safe.(from_string contents |> Util.to_list) |> List.map ~f:(fun m -> Yojson.Safe.to_string m |> Member_j.t_of_string)) + | "GUILD_ROLE_CREATE" -> GUILD_ROLE_CREATE (Role_j.t_of_string contents) + | "GUILD_ROLE_UPDATE" -> GUILD_ROLE_UPDATE (Role_j.t_of_string contents) + | "GUILD_ROLE_DELETE" -> GUILD_ROLE_DELETE (Role_j.t_of_string contents) + | "MESSAGE_CREATE" -> MESSAGE_CREATE (Message_j.t_of_string contents) + | "MESSAGE_UPDATE" -> MESSAGE_UPDATE (Message_j.t_of_string contents) + | "MESSAGE_DELETE" -> MESSAGE_DELETE (Message_j.t_of_string contents) + | "MESSAGE_BULK_DELETE" -> MESSAGE_BULK_DELETE (Yojson.Safe.(from_string contents |> Util.to_list) |> List.map ~f:(fun m -> Yojson.Safe.to_string m |> Message_j.t_of_string)) + | "MESSAGE_REACTION_ADD" -> MESSAGE_REACTION_ADD (Reaction_j.t_of_string contents) + | "MESSAGE_REACTION_REMOVE" -> MESSAGE_REACTION_REMOVE (Reaction_j.t_of_string contents) + | "MESSAGE_REACTION_REMOVE_ALL" -> MESSAGE_REACTION_REMOVE_ALL (Yojson.Safe.(from_string contents |> Util.to_list) |> List.map ~f:(fun m -> Yojson.Safe.to_string m |> Reaction_j.t_of_string)) + | "PRESENCE_UPDATE" -> PRESENCE_UPDATE (Presence_j.t_of_string contents) + | "TYPING_START" -> TYPING_START (Yojson.Safe.from_string contents) + | "USER_UPDATE" -> USER_UPDATE (Yojson.Safe.from_string contents) + | "VOICE_STATE_UPDATE" -> VOICE_STATE_UPDATE (Yojson.Safe.from_string contents) + | "VOICE_SERVER_UPDATE" -> VOICE_SERVER_UPDATE (Yojson.Safe.from_string contents) + | "WEBHOOKS_UPDATE" -> WEBHOOKS_UPDATE (Yojson.Safe.from_string contents) + | s -> raise (Invalid_event s)
\ No newline at end of file diff --git a/lib/http.ml b/lib/http.ml index 8d0b679..810bdc3 100644 --- a/lib/http.ml +++ b/lib/http.ml @@ -1,319 +1,339 @@ -open Async -open Cohttp +module Make(T : S.Token) = struct + open Async + open Cohttp + include T + + module Base = struct + exception Invalid_Method + exception Bad_response_headers + + let rl = ref Rl.empty + + let base_url = "https://discordapp.com/api/v7" + + let process_url path = + Uri.of_string (base_url ^ path) + + let process_request_body body = + body + |> Yojson.Safe.to_string + |> Cohttp_async.Body.of_string + + let process_request_headers () = + let h = Header.init () in + Header.add_list h [ + "User-Agent", "Dis.ml v0.1.0"; + "Authorization", ("Bot " ^ token); + "Content-Type", "application/json"; + ] + + let process_response path ((resp:Response.t), body) = + (match Response.headers resp + |> Rl.rl_of_header with + | Some r -> Mvar.put (Rl.find_exn !rl path) r + | None -> raise Bad_response_headers) + >>= fun () -> + body |> Cohttp_async.Body.to_string >>| Yojson.Safe.from_string + + let request ?(body=`Null) m path = + rl := Rl.update ~f:(function + | None -> + let r = Mvar.create () in + Mvar.set r Rl.default; + r + | Some r -> r + ) !rl path; + let limit = Rl.find_exn !rl path in + Mvar.take limit >>= fun limit -> + let process () = + let uri = process_url path in + let headers = process_request_headers () in + let body = process_request_body body in + (match m with + | `DELETE -> Cohttp_async.Client.delete ~headers ~body uri + | `GET -> Cohttp_async.Client.get ~headers uri + | `PATCH -> Cohttp_async.Client.patch ~headers ~body uri + | `POST -> Cohttp_async.Client.post ~headers ~body uri + | `PUT -> Cohttp_async.Client.put ~headers ~body uri + | _ -> raise Invalid_Method) + >>= process_response path + in if limit.remaining > 0 then process () + else Clock.at (Core.Time.(Span.of_int_sec limit.reset |> of_span_since_epoch)) >>= process + end -module Base = struct - exception Invalid_Method + let get_gateway () = + Base.request `GET Endpoints.gateway - let base_url = "https://discordapp.com/api/v7" - let cdn_url = "https://cdn.discordapp.com" + let get_gateway_bot () = + Base.request `GET Endpoints.gateway_bot - let process_url path = - Uri.of_string (base_url ^ path) + let get_channel channel_id = + Base.request `GET (Endpoints.channel channel_id) - let process_request_body body = - body - |> Yojson.Basic.to_string - |> Cohttp_async.Body.of_string + let modify_channel channel_id body = + Base.request ~body `PATCH (Endpoints.channel channel_id) - let process_request_headers () = - let token = match Sys.getenv "DISCORD_TOKEN" with - | Some t -> t - | None -> failwith "Please provide a token" - in - let h = Header.init_with "User-Agent" "Dis.ml v0.1.0" in - let h = Header.add h "Authorization" ("Bot " ^ token) in - Header.add h "Content-Type" "application/json" + let delete_channel channel_id = + Base.request `DELETE (Endpoints.channel channel_id) - (* TODO Finish processor *) - let process_response (_resp, body) = - body |> Cohttp_async.Body.to_string >>| Yojson.Basic.from_string + let get_messages channel_id = + Base.request `GET (Endpoints.channel_messages channel_id) - let request ?(body=`Null) m path = - let uri = process_url path in - let headers = process_request_headers () in - let body = process_request_body body in - (match m with - | `DELETE -> Cohttp_async.Client.delete ~headers ~body uri - | `GET -> Cohttp_async.Client.get ~headers uri - | `PATCH -> Cohttp_async.Client.patch ~headers ~body uri - | `POST -> Cohttp_async.Client.post ~headers ~body uri - | `PUT -> Cohttp_async.Client.put ~headers ~body uri - | _ -> raise Invalid_Method) - >>= process_response -end + let get_message channel_id message_id = + Base.request `GET (Endpoints.channel_message channel_id message_id) -let get_gateway () = - Base.request `GET Endpoints.gateway + let create_message channel_id body = + Base.request ~body:body `POST (Endpoints.channel_messages channel_id) -let get_gateway_bot () = - Base.request `GET Endpoints.gateway_bot + let create_reaction channel_id message_id emoji = + Base.request `PUT (Endpoints.channel_reaction_me channel_id message_id emoji) -let get_channel channel_id = - Base.request `GET (Endpoints.channel channel_id) + let delete_own_reaction channel_id message_id emoji = + Base.request `DELETE (Endpoints.channel_reaction_me channel_id message_id emoji) -let modify_channel channel_id body = - Base.request ~body `PATCH (Endpoints.channel channel_id) + let delete_reaction channel_id message_id emoji user_id = + Base.request `DELETE (Endpoints.channel_reaction channel_id message_id emoji user_id) -let delete_channel channel_id = - Base.request `DELETE (Endpoints.channel channel_id) + let get_reactions channel_id message_id emoji = + Base.request `GET (Endpoints.channel_reactions_get channel_id message_id emoji) -let get_messages channel_id = - Base.request `GET (Endpoints.channel_messages channel_id) + let delete_reactions channel_id message_id = + Base.request `DELETE (Endpoints.channel_reactions_delete channel_id message_id) -let get_message channel_id message_id = - Base.request `GET (Endpoints.channel_message channel_id message_id) + let edit_message channel_id message_id body = + Base.request ~body `PATCH (Endpoints.channel_message channel_id message_id) -let create_message channel_id body = - Base.request ~body:body `POST (Endpoints.channel_messages channel_id) + let delete_message channel_id message_id = + Base.request `DELETE (Endpoints.channel_message channel_id message_id) -let create_reaction channel_id message_id emoji = - Base.request `PUT (Endpoints.channel_reaction_me channel_id message_id emoji) + let bulk_delete channel_id body = + Base.request ~body `POST (Endpoints.channel_bulk_delete channel_id) -let delete_own_reaction channel_id message_id emoji = - Base.request `DELETE (Endpoints.channel_reaction_me channel_id message_id emoji) + let edit_channel_permissions channel_id overwrite_id body = + Base.request ~body `PUT (Endpoints.channel_permission channel_id overwrite_id) -let delete_reaction channel_id message_id emoji user_id = - Base.request `DELETE (Endpoints.channel_reaction channel_id message_id emoji user_id) + let get_channel_invites channel_id = + Base.request `GET (Endpoints.channel_invites channel_id) -let get_reactions channel_id message_id emoji = - Base.request `GET (Endpoints.channel_reactions_get channel_id message_id emoji) + let create_channel_invite channel_id body = + Base.request ~body `POST (Endpoints.channel_invites channel_id) -let delete_reactions channel_id message_id = - Base.request `DELETE (Endpoints.channel_reactions_delete channel_id message_id) + let delete_channel_permission channel_id overwrite_id = + Base.request `DELETE (Endpoints.channel_permission channel_id overwrite_id) -let edit_message channel_id message_id body = - Base.request ~body `PATCH (Endpoints.channel_message channel_id message_id) + let broadcast_typing channel_id = + Base.request `POST (Endpoints.channel_typing channel_id) -let delete_message channel_id message_id = - Base.request `DELETE (Endpoints.channel_message channel_id message_id) + let get_pinned_messages channel_id = + Base.request `GET (Endpoints.channel_pins channel_id) -let bulk_delete channel_id body = - Base.request ~body `POST (Endpoints.channel_bulk_delete channel_id) + let pin_message channel_id message_id = + Base.request `PUT (Endpoints.channel_pin channel_id message_id) -let edit_channel_permissions channel_id overwrite_id body = - Base.request ~body `PUT (Endpoints.channel_permission channel_id overwrite_id) + let unpin_message channel_id message_id = + Base.request `DELETE (Endpoints.channel_pin channel_id message_id) -let get_channel_invites channel_id = - Base.request `GET (Endpoints.channel_invites channel_id) + let group_recipient_add channel_id user_id = + Base.request `PUT (Endpoints.group_recipient channel_id user_id) -let create_channel_invite channel_id body = - Base.request ~body `POST (Endpoints.channel_invites channel_id) + let group_recipient_remove channel_id user_id = + Base.request `DELETE (Endpoints.group_recipient channel_id user_id) -let delete_channel_permission channel_id overwrite_id = - Base.request `DELETE (Endpoints.channel_permission channel_id overwrite_id) + let get_emojis guild_id = + Base.request `GET (Endpoints.guild_emojis guild_id) -let broadcast_typing channel_id = - Base.request `POST (Endpoints.channel_typing channel_id) + let get_emoji guild_id emoji_id = + Base.request `GET (Endpoints.guild_emoji guild_id emoji_id) -let get_pinned_messages channel_id = - Base.request `GET (Endpoints.channel_pins channel_id) + let create_emoji guild_id body = + Base.request ~body `POST (Endpoints.guild_emojis guild_id) -let pin_message channel_id message_id = - Base.request `PUT (Endpoints.channel_pin channel_id message_id) + let edit_emoji guild_id emoji_id body = + Base.request ~body `PATCH (Endpoints.guild_emoji guild_id emoji_id) -let unpin_message channel_id message_id = - Base.request `DELETE (Endpoints.channel_pin channel_id message_id) + let delete_emoji guild_id emoji_id = + Base.request `DELETE (Endpoints.guild_emoji guild_id emoji_id) -let group_recipient_add channel_id user_id = - Base.request `PUT (Endpoints.group_recipient channel_id user_id) + let create_guild body = + Base.request ~body `POST Endpoints.guilds -let group_recipient_remove channel_id user_id = - Base.request `DELETE (Endpoints.group_recipient channel_id user_id) + let get_guild guild_id = + Base.request `GET (Endpoints.guild guild_id) -let get_emojis guild_id = - Base.request `GET (Endpoints.guild_emojis guild_id) + let edit_guild guild_id body = + Base.request ~body `PATCH (Endpoints.guild guild_id) -let get_emoji guild_id emoji_id = - Base.request `GET (Endpoints.guild_emoji guild_id emoji_id) + let delete_guild guild_id = + Base.request `DELETE (Endpoints.guild guild_id) -let create_emoji guild_id body = - Base.request ~body `POST (Endpoints.guild_emojis guild_id) + let get_guild_channels guild_id = + Base.request `GET (Endpoints.guild_channels guild_id) -let edit_emoji guild_id emoji_id body = - Base.request ~body `PATCH (Endpoints.guild_emoji guild_id emoji_id) + let create_guild_channel guild_id body = + Base.request ~body `POST (Endpoints.guild_channels guild_id) -let delete_emoji guild_id emoji_id = - Base.request `DELETE (Endpoints.guild_emoji guild_id emoji_id) + let modify_guild_channel_positions guild_id body = + Base.request ~body `PATCH (Endpoints.guild_channels guild_id) -let create_guild body = - Base.request ~body `POST Endpoints.guilds + let get_member guild_id user_id = + Base.request `GET (Endpoints.guild_member guild_id user_id) -let get_guild guild_id = - Base.request `GET (Endpoints.guild guild_id) + let get_members guild_id = + Base.request `GET (Endpoints.guild_members guild_id) -let edit_guild guild_id body = - Base.request ~body `PATCH (Endpoints.guild guild_id) + let add_member guild_id user_id body = + Base.request ~body `PUT (Endpoints.guild_member guild_id user_id) -let delete_guild guild_id = - Base.request `DELETE (Endpoints.guild guild_id) + let edit_member guild_id user_id body = + Base.request ~body `PATCH (Endpoints.guild_member guild_id user_id) -let get_guild_channels guild_id = - Base.request `GET (Endpoints.guild_channels guild_id) + let remove_member guild_id user_id = + Base.request `DELETE (Endpoints.guild_member guild_id user_id) -let create_guild_channel guild_id body = - Base.request ~body `POST (Endpoints.guild_channels guild_id) + let change_nickname guild_id body = + Base.request ~body `PATCH (Endpoints.guild_me_nick guild_id) -let modify_guild_channel_positions guild_id body = - Base.request ~body `PATCH (Endpoints.guild_channels guild_id) + let add_member_role guild_id user_id role_id = + Base.request `PUT (Endpoints.guild_member_role guild_id user_id role_id) -let get_member guild_id user_id = - Base.request `GET (Endpoints.guild_member guild_id user_id) + let remove_member_role guild_id user_id role_id = + Base.request `DELETE (Endpoints.guild_member_role guild_id user_id role_id) -let get_members guild_id = - Base.request `GET (Endpoints.guild_members guild_id) + let get_bans guild_id = + Base.request `GET (Endpoints.guild_bans guild_id) -let add_member guild_id user_id body = - Base.request ~body `PUT (Endpoints.guild_member guild_id user_id) + let get_ban guild_id user_id = + Base.request `GET (Endpoints.guild_ban guild_id user_id) -let edit_member guild_id user_id body = - Base.request ~body `PATCH (Endpoints.guild_member guild_id user_id) + let guild_ban_add guild_id user_id body = + Base.request ~body `PUT (Endpoints.guild_ban guild_id user_id) -let remove_member guild_id user_id = - Base.request `DELETE (Endpoints.guild_member guild_id user_id) + let guild_ban_remove guild_id user_id = + Base.request `DELETE (Endpoints.guild_ban guild_id user_id) -let change_nickname guild_id body = - Base.request ~body `PATCH (Endpoints.guild_me_nick guild_id) + let get_roles guild_id = + Base.request `GET (Endpoints.guild_roles guild_id) -let add_member_role guild_id user_id role_id = - Base.request `PUT (Endpoints.guild_member_role guild_id user_id role_id) + let guild_role_add guild_id body = + Base.request ~body `POST (Endpoints.guild_roles guild_id) -let remove_member_role guild_id user_id role_id = - Base.request `DELETE (Endpoints.guild_member_role guild_id user_id role_id) + let guild_roles_edit guild_id body = + Base.request ~body `PATCH (Endpoints.guild_roles guild_id) -let get_bans guild_id = - Base.request `GET (Endpoints.guild_bans guild_id) + let guild_role_edit guild_id role_id body = + Base.request ~body `PATCH (Endpoints.guild_role guild_id role_id) -let get_ban guild_id user_id = - Base.request `GET (Endpoints.guild_ban guild_id user_id) + let guild_role_remove guild_id role_id = + Base.request `DELETE (Endpoints.guild_role guild_id role_id) -let guild_ban_add guild_id user_id body = - Base.request ~body `PUT (Endpoints.guild_ban guild_id user_id) + let guild_prune_count guild_id = + Base.request `GET (Endpoints.guild_prune guild_id) -let guild_ban_remove guild_id user_id = - Base.request `DELETE (Endpoints.guild_ban guild_id user_id) + let guild_prune_start guild_id body = + Base.request ~body `POST (Endpoints.guild_prune guild_id) -let get_roles guild_id = - Base.request `GET (Endpoints.guild_roles guild_id) + let get_guild_voice_regions guild_id = + Base.request `GET (Endpoints.guild_voice_regions guild_id) -let guild_role_add guild_id body = - Base.request ~body `POST (Endpoints.guild_roles guild_id) + let get_guild_invites guild_id = + Base.request `GET (Endpoints.guild_invites guild_id) -let guild_roles_edit guild_id body = - Base.request ~body `PATCH (Endpoints.guild_roles guild_id) + let get_integrations guild_id = + Base.request `GET (Endpoints.guild_integrations guild_id) -let guild_role_edit guild_id role_id body = - Base.request ~body `PATCH (Endpoints.guild_role guild_id role_id) + let add_integration guild_id body = + Base.request ~body `POST (Endpoints.guild_integrations guild_id) -let guild_role_remove guild_id role_id = - Base.request `DELETE (Endpoints.guild_role guild_id role_id) + let edit_integration guild_id integration_id body = + Base.request ~body `POST (Endpoints.guild_integration guild_id integration_id) -let guild_prune_count guild_id = - Base.request `GET (Endpoints.guild_prune guild_id) + let delete_integration guild_id integration_id = + Base.request `DELETE (Endpoints.guild_integration guild_id integration_id) -let guild_prune_start guild_id body = - Base.request ~body `POST (Endpoints.guild_prune guild_id) + let sync_integration guild_id integration_id = + Base.request `POST (Endpoints.guild_integration_sync guild_id integration_id) -let get_guild_voice_regions guild_id = - Base.request `GET (Endpoints.guild_voice_regions guild_id) + let get_guild_embed guild_id = + Base.request `GET (Endpoints.guild_embed guild_id) -let get_guild_invites guild_id = - Base.request `GET (Endpoints.guild_invites guild_id) + let edit_guild_embed guild_id body = + Base.request ~body `PATCH (Endpoints.guild_embed guild_id) -let get_integrations guild_id = - Base.request `GET (Endpoints.guild_integrations guild_id) + let get_vanity_url guild_id = + Base.request `GET (Endpoints.guild_vanity_url guild_id) -let add_integration guild_id body = - Base.request ~body `POST (Endpoints.guild_integrations guild_id) + let get_invite invite_code = + Base.request `GET (Endpoints.invite invite_code) -let edit_integration guild_id integration_id body = - Base.request ~body `POST (Endpoints.guild_integration guild_id integration_id) + let delete_invite invite_code = + Base.request `DELETE (Endpoints.invite invite_code) -let delete_integration guild_id integration_id = - Base.request `DELETE (Endpoints.guild_integration guild_id integration_id) + let get_current_user () = + Base.request `GET Endpoints.me -let sync_integration guild_id integration_id = - Base.request `POST (Endpoints.guild_integration_sync guild_id integration_id) + let edit_current_user body = + Base.request ~body `PATCH Endpoints.me -let get_guild_embed guild_id = - Base.request `GET (Endpoints.guild_embed guild_id) + let get_guilds () = + Base.request `GET Endpoints.me_guilds -let edit_guild_embed guild_id body = - Base.request ~body `PATCH (Endpoints.guild_embed guild_id) + let leave_guild guild_id = + Base.request `DELETE (Endpoints.me_guild guild_id) -let get_vanity_url guild_id = - Base.request `GET (Endpoints.guild_vanity_url guild_id) + let get_private_channels () = + Base.request `GET Endpoints.me_channels -let get_invite invite_code = - Base.request `GET (Endpoints.invite invite_code) + let create_dm body = + Base.request ~body `POST Endpoints.me_channels -let delete_invite invite_code = - Base.request `DELETE (Endpoints.invite invite_code) + let create_group_dm body = + Base.request ~body `POST Endpoints.me_channels -let get_current_user () = - Base.request `GET Endpoints.me + let get_connections () = + Base.request `GET Endpoints.me_connections -let edit_current_user body = - Base.request ~body `PATCH Endpoints.me + let get_user user_id = + Base.request `GET (Endpoints.user user_id) -let get_guilds () = - Base.request `GET Endpoints.me_guilds + let get_voice_regions () = + Base.request `GET Endpoints.regions -let leave_guild guild_id = - Base.request `DELETE (Endpoints.me_guild guild_id) + let create_webhook channel_id body = + Base.request ~body `POST (Endpoints.webhooks_channel channel_id) -let get_private_channels () = - Base.request `GET Endpoints.me_channels + let get_channel_webhooks channel_id = + Base.request `GET (Endpoints.webhooks_channel channel_id) -let create_dm body = - Base.request ~body `POST Endpoints.me_channels + let get_guild_webhooks guild_id = + Base.request `GET (Endpoints.webhooks_guild guild_id) -let create_group_dm body = - Base.request ~body `POST Endpoints.me_channels + let get_webhook webhook_id = + Base.request `GET (Endpoints.webhook webhook_id) -let get_connections () = - Base.request `GET Endpoints.me_connections + let get_webhook_with_token webhook_id token = + Base.request `GET (Endpoints.webhook_token webhook_id token) -let get_user user_id = - Base.request `GET (Endpoints.user user_id) + let edit_webhook webhook_id body = + Base.request ~body `PATCH (Endpoints.webhook webhook_id) -let get_voice_regions () = - Base.request `GET Endpoints.regions + let edit_webhook_with_token webhook_id token body = + Base.request ~body `PATCH (Endpoints.webhook_token webhook_id token) -let create_webhook channel_id body = - Base.request ~body `POST (Endpoints.webhooks_channel channel_id) + let delete_webhook webhook_id = + Base.request `DELETE (Endpoints.webhook webhook_id) -let get_channel_webhooks channel_id = - Base.request `GET (Endpoints.webhooks_channel channel_id) + let delete_webhook_with_token webhook_id token = + Base.request `DELETE (Endpoints.webhook_token webhook_id token) -let get_guild_webhooks guild_id = - Base.request `GET (Endpoints.webhooks_guild guild_id) + let execute_webhook webhook_id token body = + Base.request ~body `POST (Endpoints.webhook_token webhook_id token) -let get_webhook webhook_id = - Base.request `GET (Endpoints.webhook webhook_id) + let execute_slack_webhook webhook_id token body = + Base.request ~body `POST (Endpoints.webhook_slack webhook_id token) -let get_webhook_with_token webhook_id token = - Base.request `GET (Endpoints.webhook_token webhook_id token) + let execute_git_webhook webhook_id token body = + Base.request ~body `POST (Endpoints.webhook_git webhook_id token) -let edit_webhook webhook_id body = - Base.request ~body `PATCH (Endpoints.webhook webhook_id) - -let edit_webhook_with_token webhook_id token body = - Base.request ~body `PATCH (Endpoints.webhook_token webhook_id token) - -let delete_webhook webhook_id = - Base.request `DELETE (Endpoints.webhook webhook_id) - -let delete_webhook_with_token webhook_id token = - Base.request `DELETE (Endpoints.webhook_token webhook_id token) - -let execute_webhook webhook_id token body = - Base.request ~body `POST (Endpoints.webhook_token webhook_id token) - -let execute_slack_webhook webhook_id token body = - Base.request ~body `POST (Endpoints.webhook_slack webhook_id token) - -let execute_git_webhook webhook_id token body = - Base.request ~body `POST (Endpoints.webhook_git webhook_id token) - -let get_audit_logs guild_id body = - Base.request ~body `GET (Endpoints.guild_audit_logs guild_id)
\ No newline at end of file + let get_audit_logs guild_id body = + Base.request ~body `GET (Endpoints.guild_audit_logs guild_id) +end
\ No newline at end of file diff --git a/lib/http.mli b/lib/http.mli new file mode 100644 index 0000000..858420a --- /dev/null +++ b/lib/http.mli @@ -0,0 +1 @@ +module Make(T : S.Token) : S.Http
\ No newline at end of file diff --git a/lib/model/channel.ml b/lib/model/channel.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/channel.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/emoji.ml b/lib/model/emoji.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/emoji.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/guild.ml b/lib/model/guild.ml deleted file mode 100644 index 6345c17..0000000 --- a/lib/model/guild.ml +++ /dev/null @@ -1,26 +0,0 @@ -type t = { - afk_channel_id: int option; - afk_timeout: int; - application_id: int option; - channels: Channel.t list; - default_message_notifications: int; - emojis: Emoji.t list; - explicit_content_filter: int; - features: string list; - icon: string option; - id: int; - joined_at: string; - large: bool; - member_count: int; - members: Member.t list; - mfa_level: int; - name: string; - owner_id: int; - presences: Presence.t list; - region: string; - roles: Role.t list; - splash: string option; - system_channel_id: int option; - verification_level: int; - voice_states: VoiceState.t list; -} diff --git a/lib/model/member.ml b/lib/model/member.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/member.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/message.ml b/lib/model/message.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/message.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/presence.ml b/lib/model/presence.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/presence.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/role.ml b/lib/model/role.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/role.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/model/user.ml b/lib/model/user.ml deleted file mode 100644 index 182ea6a..0000000 --- a/lib/model/user.ml +++ /dev/null @@ -1,26 +0,0 @@ -type t = { - id: int; - username: string; - discriminator: string; - avatar: string option; - bot: bool; -} - -let from_json term = - let module J = Yojson.Basic.Util in - let id = J.member "id" term - |> J.to_string - |> int_of_string - in - let username = J.member "username" term - |> J.to_string in - let discriminator = J.member "discriminator" term - |> J.to_string in - let avatar = J.member "avatar" term - |> J.to_string_option in - let bot = J.member "bot" term - |> J.to_bool in - { id; username; discriminator; avatar; bot; } - -let tag user = - user.username ^ user.discriminator diff --git a/lib/model/voiceState.ml b/lib/model/voiceState.ml deleted file mode 100644 index eb6679e..0000000 --- a/lib/model/voiceState.ml +++ /dev/null @@ -1 +0,0 @@ -type t
\ No newline at end of file diff --git a/lib/models.ml b/lib/models.ml new file mode 100644 index 0000000..250de34 --- /dev/null +++ b/lib/models.ml @@ -0,0 +1,17 @@ +module Make(H : S.Http) = struct + module Http = H + module Activity = Activity.Make(H) + module Attachment = Attachment.Make(H) + module Ban = Ban.Make(H) + module Channel = Channel.Make(H) + module Embed = Embed.Make(H) + module Emoji = Emoji.Make(H) + module Guild = Guild.Make(H) + module Member = Member.Make(H) + module Message = Message.Make(H) + module Presence = Presence.Make(H) + module Reaction = Reaction.Make(H) + module Role = Role.Make(H) + module Snowflake = Snowflake.Make(H) + module User = User.Make(H) +end
\ No newline at end of file diff --git a/lib/models/activity.ml b/lib/models/activity.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/activity.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/attachment.ml b/lib/models/attachment.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/attachment.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/ban.ml b/lib/models/ban.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/ban.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/channel.ml b/lib/models/channel.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/channel.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/embed.ml b/lib/models/embed.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/embed.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/emoji.ml b/lib/models/emoji.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/emoji.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/gen/activity.atd b/lib/models/gen/activity.atd new file mode 100644 index 0000000..8e02191 --- /dev/null +++ b/lib/models/gen/activity.atd @@ -0,0 +1,5 @@ +type t = { + name: string; + kind <json name="type">: int; + ?url: string option; +}
\ No newline at end of file diff --git a/lib/models/gen/activity_j.ml b/lib/models/gen/activity_j.ml new file mode 100644 index 0000000..eb1a62e --- /dev/null +++ b/lib/models/gen/activity_j.ml @@ -0,0 +1,274 @@ +(* Auto-generated from "activity.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type t = Activity_t.t = { name: string; kind: int; url: string option } + +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"type\":"; + ( + Yojson.Safe.write_int + ) + ob x.kind; + (match x.url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_kind = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_url = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 2 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 2 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x3 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "name"; "kind" |]; + ( + { + name = !field_name; + kind = !field_kind; + url = !field_url; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/activity_j.mli b/lib/models/gen/activity_j.mli new file mode 100644 index 0000000..c179efb --- /dev/null +++ b/lib/models/gen/activity_j.mli @@ -0,0 +1,25 @@ +(* Auto-generated from "activity.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type t = Activity_t.t = { name: string; kind: int; url: string option } + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/activity_t.ml b/lib/models/gen/activity_t.ml new file mode 100644 index 0000000..6bb2049 --- /dev/null +++ b/lib/models/gen/activity_t.ml @@ -0,0 +1,4 @@ +(* Auto-generated from "activity.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type t = { name: string; kind: int; url: string option } diff --git a/lib/models/gen/activity_t.mli b/lib/models/gen/activity_t.mli new file mode 100644 index 0000000..6bb2049 --- /dev/null +++ b/lib/models/gen/activity_t.mli @@ -0,0 +1,4 @@ +(* Auto-generated from "activity.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type t = { name: string; kind: int; url: string option } diff --git a/lib/models/gen/attachment.atd b/lib/models/gen/attachment.atd new file mode 100644 index 0000000..9757b49 --- /dev/null +++ b/lib/models/gen/attachment.atd @@ -0,0 +1,11 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract + +type t = { + id: snowflake; + filename: string; + size: int; + url: string; + proxy_url: string; + ?height: int option; + ?width: int option; +}
\ No newline at end of file diff --git a/lib/models/gen/attachment_j.ml b/lib/models/gen/attachment_j.ml new file mode 100644 index 0000000..28f909d --- /dev/null +++ b/lib/models/gen/attachment_j.ml @@ -0,0 +1,456 @@ +(* Auto-generated from "attachment.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = Attachment_t.t = { + id: snowflake; + filename: string; + size: int; + url: string; + proxy_url: string; + height: int option; + width: int option +} + +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_int + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"filename\":"; + ( + Yojson.Safe.write_string + ) + ob x.filename; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"size\":"; + ( + Yojson.Safe.write_int + ) + ob x.size; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x.url; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"proxy_url\":"; + ( + Yojson.Safe.write_string + ) + ob x.proxy_url; + (match x.height with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"height\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.width with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"width\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_filename = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_size = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_url = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_proxy_url = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_height = ref (None) in + let field_width = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 3 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 's' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'z' && String.unsafe_get s (pos+3) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 6 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'f' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'a' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'u' && String.unsafe_get s (pos+7) = 'r' && String.unsafe_get s (pos+8) = 'l' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_filename := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_size := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_url := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_proxy_url := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 3 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 's' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'z' && String.unsafe_get s (pos+3) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 6 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'f' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'a' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'u' && String.unsafe_get s (pos+7) = 'r' && String.unsafe_get s (pos+8) = 'l' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_filename := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_size := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_url := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_proxy_url := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1f then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "filename"; "size"; "url"; "proxy_url" |]; + ( + { + id = !field_id; + filename = !field_filename; + size = !field_size; + url = !field_url; + proxy_url = !field_proxy_url; + height = !field_height; + width = !field_width; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/attachment_j.mli b/lib/models/gen/attachment_j.mli new file mode 100644 index 0000000..6b11b08 --- /dev/null +++ b/lib/models/gen/attachment_j.mli @@ -0,0 +1,55 @@ +(* Auto-generated from "attachment.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = Attachment_t.t = { + id: snowflake; + filename: string; + size: int; + url: string; + proxy_url: string; + height: int option; + width: int option +} + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/attachment_t.ml b/lib/models/gen/attachment_t.ml new file mode 100644 index 0000000..0485dcc --- /dev/null +++ b/lib/models/gen/attachment_t.ml @@ -0,0 +1,14 @@ +(* Auto-generated from "attachment.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + filename: string; + size: int; + url: string; + proxy_url: string; + height: int option; + width: int option +} diff --git a/lib/models/gen/attachment_t.mli b/lib/models/gen/attachment_t.mli new file mode 100644 index 0000000..0485dcc --- /dev/null +++ b/lib/models/gen/attachment_t.mli @@ -0,0 +1,14 @@ +(* Auto-generated from "attachment.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + filename: string; + size: int; + url: string; + proxy_url: string; + height: int option; + width: int option +} diff --git a/lib/models/gen/ban.atd b/lib/models/gen/ban.atd new file mode 100644 index 0000000..0a87338 --- /dev/null +++ b/lib/models/gen/ban.atd @@ -0,0 +1,6 @@ +type user <ocaml from="User" t="t"> = abstract + +type t = { + ?reason: string option; + user: user; +}
\ No newline at end of file diff --git a/lib/models/gen/ban_j.ml b/lib/models/gen/ban_j.ml new file mode 100644 index 0000000..e608f67 --- /dev/null +++ b/lib/models/gen/ban_j.ml @@ -0,0 +1,235 @@ +(* Auto-generated from "ban.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type t = Ban_t.t = { reason: string option; user: user } + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.reason with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"reason\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"user\":"; + ( + write_user + ) + ob x.user; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_reason = ref (None) in + let field_user = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'n' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_reason := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_user := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x1; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'n' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_reason := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_user := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x1; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "user" |]; + ( + { + reason = !field_reason; + user = !field_user; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/ban_j.mli b/lib/models/gen/ban_j.mli new file mode 100644 index 0000000..9449b5c --- /dev/null +++ b/lib/models/gen/ban_j.mli @@ -0,0 +1,47 @@ +(* Auto-generated from "ban.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type t = Ban_t.t = { reason: string option; user: user } + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/ban_t.ml b/lib/models/gen/ban_t.ml new file mode 100644 index 0000000..7d9c5a0 --- /dev/null +++ b/lib/models/gen/ban_t.ml @@ -0,0 +1,6 @@ +(* Auto-generated from "ban.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type t = { reason: string option; user: user } diff --git a/lib/models/gen/ban_t.mli b/lib/models/gen/ban_t.mli new file mode 100644 index 0000000..7d9c5a0 --- /dev/null +++ b/lib/models/gen/ban_t.mli @@ -0,0 +1,6 @@ +(* Auto-generated from "ban.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type t = { reason: string option; user: user } diff --git a/lib/models/gen/channel.atd b/lib/models/gen/channel.atd new file mode 100644 index 0000000..6ab58cf --- /dev/null +++ b/lib/models/gen/channel.atd @@ -0,0 +1,19 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract + +type t = { + id: snowflake; + kind <json name="type">: int; + ?guild_id: snowflake option; + ?position: int option; + ?name: string option; + ?topic: string option; + ?nsfw: bool option; + ?bitrate: int option; + ?user_limit: int option; + ?recipients: user list option; + ?icon: string option; + ?owner_id: snowflake option; + ?application_id: snowflake option; + ?parent_id: snowflake option; +}
\ No newline at end of file diff --git a/lib/models/gen/channel_j.ml b/lib/models/gen/channel_j.ml new file mode 100644 index 0000000..7369230 --- /dev/null +++ b/lib/models/gen/channel_j.ml @@ -0,0 +1,1136 @@ +(* Auto-generated from "channel.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Channel_t.t = { + id: snowflake; + kind: int; + guild_id: snowflake option; + position: int option; + name: string option; + topic: string option; + nsfw: bool option; + bitrate: int option; + user_limit: int option; + recipients: user list option; + icon: string option; + owner_id: snowflake option; + application_id: snowflake option; + parent_id: snowflake option +} + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__5 = ( + Atdgen_runtime.Oj_run.write_list ( + write_user + ) +) +let string_of__5 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__5 ob x; + Bi_outbuf.contents ob +let read__5 = ( + Atdgen_runtime.Oj_run.read_list ( + read_user + ) +) +let _5_of_string s = + read__5 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__6 = ( + Atdgen_runtime.Oj_run.write_option ( + write__5 + ) +) +let string_of__6 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__6 ob x; + Bi_outbuf.contents ob +let read__6 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__5 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__5 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _6_of_string s = + read__6 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__4 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_bool + ) +) +let string_of__4 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__4 ob x; + Bi_outbuf.contents ob +let read__4 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _4_of_string s = + read__4 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_int + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + write_snowflake + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"type\":"; + ( + Yojson.Safe.write_int + ) + ob x.kind; + (match x.guild_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"guild_id\":"; + ( + write_snowflake + ) + ob x; + ); + (match x.position with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"position\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.name with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.topic with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"topic\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.nsfw with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"nsfw\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.bitrate with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"bitrate\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.user_limit with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"user_limit\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.recipients with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"recipients\":"; + ( + write__5 + ) + ob x; + ); + (match x.icon with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"icon\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.owner_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"owner_id\":"; + ( + write_snowflake + ) + ob x; + ); + (match x.application_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"application_id\":"; + ( + write_snowflake + ) + ob x; + ); + (match x.parent_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"parent_id\":"; + ( + write_snowflake + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_kind = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_guild_id = ref (None) in + let field_position = ref (None) in + let field_name = ref (None) in + let field_topic = ref (None) in + let field_nsfw = ref (None) in + let field_bitrate = ref (None) in + let field_user_limit = ref (None) in + let field_recipients = ref (None) in + let field_icon = ref (None) in + let field_owner_id = ref (None) in + let field_application_id = ref (None) in + let field_parent_id = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' then ( + 10 + ) + else ( + -1 + ) + ) + | 'n' -> ( + match String.unsafe_get s (pos+1) with + | 'a' -> ( + if String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+2) = 'f' && String.unsafe_get s (pos+3) = 'w' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'c' then ( + 5 + ) + else ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'b' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 2 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+1) = 'w' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 11 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'd' then ( + 13 + ) + else ( + -1 + ) + ) + | 10 -> ( + match String.unsafe_get s pos with + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'p' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 's' then ( + 9 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'l' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 't' then ( + 8 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'p' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 12 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_guild_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_position := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_name := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_topic := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nsfw := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_bitrate := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_user_limit := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_recipients := ( + Some ( + ( + read__5 + ) p lb + ) + ); + ) + | 10 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_owner_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 12 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_application_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 13 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_parent_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' then ( + 10 + ) + else ( + -1 + ) + ) + | 'n' -> ( + match String.unsafe_get s (pos+1) with + | 'a' -> ( + if String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+2) = 'f' && String.unsafe_get s (pos+3) = 'w' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'c' then ( + 5 + ) + else ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'b' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 2 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+1) = 'w' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 11 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'd' then ( + 13 + ) + else ( + -1 + ) + ) + | 10 -> ( + match String.unsafe_get s pos with + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'p' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 's' then ( + 9 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'l' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 't' then ( + 8 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'p' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 12 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_guild_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_position := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_name := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_topic := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nsfw := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_bitrate := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_user_limit := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_recipients := ( + Some ( + ( + read__5 + ) p lb + ) + ); + ) + | 10 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_owner_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 12 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_application_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 13 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_parent_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x3 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "kind" |]; + ( + { + id = !field_id; + kind = !field_kind; + guild_id = !field_guild_id; + position = !field_position; + name = !field_name; + topic = !field_topic; + nsfw = !field_nsfw; + bitrate = !field_bitrate; + user_limit = !field_user_limit; + recipients = !field_recipients; + icon = !field_icon; + owner_id = !field_owner_id; + application_id = !field_application_id; + parent_id = !field_parent_id; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/channel_j.mli b/lib/models/gen/channel_j.mli new file mode 100644 index 0000000..ec4048c --- /dev/null +++ b/lib/models/gen/channel_j.mli @@ -0,0 +1,84 @@ +(* Auto-generated from "channel.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Channel_t.t = { + id: snowflake; + kind: int; + guild_id: snowflake option; + position: int option; + name: string option; + topic: string option; + nsfw: bool option; + bitrate: int option; + user_limit: int option; + recipients: user list option; + icon: string option; + owner_id: snowflake option; + application_id: snowflake option; + parent_id: snowflake option +} + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/channel_t.ml b/lib/models/gen/channel_t.ml new file mode 100644 index 0000000..a5c9ce4 --- /dev/null +++ b/lib/models/gen/channel_t.ml @@ -0,0 +1,23 @@ +(* Auto-generated from "channel.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + kind: int; + guild_id: snowflake option; + position: int option; + name: string option; + topic: string option; + nsfw: bool option; + bitrate: int option; + user_limit: int option; + recipients: user list option; + icon: string option; + owner_id: snowflake option; + application_id: snowflake option; + parent_id: snowflake option +} diff --git a/lib/models/gen/channel_t.mli b/lib/models/gen/channel_t.mli new file mode 100644 index 0000000..a5c9ce4 --- /dev/null +++ b/lib/models/gen/channel_t.mli @@ -0,0 +1,23 @@ +(* Auto-generated from "channel.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + kind: int; + guild_id: snowflake option; + position: int option; + name: string option; + topic: string option; + nsfw: bool option; + bitrate: int option; + user_limit: int option; + recipients: user list option; + icon: string option; + owner_id: snowflake option; + application_id: snowflake option; + parent_id: snowflake option +} diff --git a/lib/models/gen/embed.atd b/lib/models/gen/embed.atd new file mode 100644 index 0000000..0d3aed4 --- /dev/null +++ b/lib/models/gen/embed.atd @@ -0,0 +1,44 @@ +type footer = { + text: string; + ?icon_url: string option; + ?proxy_icon_url: string option; +} + +type image = { + ?url: string option; + ?proxy_url: string option; + ?height: int option; + ?width: int option; +} + +type video = { + ?url: string option; + ?height: int option; + ?width: int option; +} + +type provider = { + ?name: string option; + ?url: string option; +} + +type field = { + name: string; + value: string; + ?inline: bool option; +} + +type t = { + ?title: string option; + ?kind: string option; + ?description: string option; + ?url: string option; + ?timestamp: string option; + ?colour: int option; + ?footer: footer option; + ?image: image option; + ?thumbnail: image option; + ?video: video option; + ?provider: provider option; + ?fields: field list option; +}
\ No newline at end of file diff --git a/lib/models/gen/embed_j.ml b/lib/models/gen/embed_j.ml new file mode 100644 index 0000000..560c517 --- /dev/null +++ b/lib/models/gen/embed_j.ml @@ -0,0 +1,2283 @@ +(* Auto-generated from "embed.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type video = Embed_t.video = { + url: string option; + height: int option; + width: int option +} + +type provider = Embed_t.provider = { + name: string option; + url: string option +} + +type image = Embed_t.image = { + url: string option; + proxy_url: string option; + height: int option; + width: int option +} + +type footer = Embed_t.footer = { + text: string; + icon_url: string option; + proxy_icon_url: string option +} + +type field = Embed_t.field = { + name: string; + value: string; + inline: bool option +} + +type t = Embed_t.t = { + title: string option; + kind: string option; + description: string option; + url: string option; + timestamp: string option; + colour: int option; + footer: footer option; + image: image option; + thumbnail: image option; + video: video option; + provider: provider option; + fields: field list option +} + +let write__2 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_int + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_video : _ -> video -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.height with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"height\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.width with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"width\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_video ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_video ob x; + Bi_outbuf.contents ob +let read_video = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_url = ref (None) in + let field_height = ref (None) in + let field_width = ref (None) in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 2 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 2 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + ( + { + url = !field_url; + height = !field_height; + width = !field_width; + } + : video) + ) +) +let video_of_string s = + read_video (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_provider : _ -> provider -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.name with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_provider ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_provider ob x; + Bi_outbuf.contents ob +let read_provider = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_name = ref (None) in + let field_url = ref (None) in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_name := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_name := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + ( + { + name = !field_name; + url = !field_url; + } + : provider) + ) +) +let provider_of_string s = + read_provider (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_image : _ -> image -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.proxy_url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"proxy_url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.height with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"height\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.width with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"width\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_image ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_image ob x; + Bi_outbuf.contents ob +let read_image = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_url = ref (None) in + let field_proxy_url = ref (None) in + let field_height = ref (None) in + let field_width = ref (None) in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 3 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'u' && String.unsafe_get s (pos+7) = 'r' && String.unsafe_get s (pos+8) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_proxy_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'w' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'h' then ( + 3 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'h' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'h' && String.unsafe_get s (pos+5) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'u' && String.unsafe_get s (pos+7) = 'r' && String.unsafe_get s (pos+8) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_proxy_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_height := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_width := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + ( + { + url = !field_url; + proxy_url = !field_proxy_url; + height = !field_height; + width = !field_width; + } + : image) + ) +) +let image_of_string s = + read_image (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_footer : _ -> footer -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"text\":"; + ( + Yojson.Safe.write_string + ) + ob x.text; + (match x.icon_url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"icon_url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.proxy_icon_url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"proxy_icon_url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_footer ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_footer ob x; + Bi_outbuf.contents ob +let read_footer = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_text = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_icon_url = ref (None) in + let field_proxy_icon_url = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'x' && String.unsafe_get s (pos+3) = 't' then ( + 0 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'u' && String.unsafe_get s (pos+6) = 'r' && String.unsafe_get s (pos+7) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = '_' && String.unsafe_get s (pos+11) = 'u' && String.unsafe_get s (pos+12) = 'r' && String.unsafe_get s (pos+13) = 'l' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_text := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_proxy_icon_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'x' && String.unsafe_get s (pos+3) = 't' then ( + 0 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'u' && String.unsafe_get s (pos+6) = 'r' && String.unsafe_get s (pos+7) = 'l' then ( + 1 + ) + else ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'x' && String.unsafe_get s (pos+4) = 'y' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = '_' && String.unsafe_get s (pos+11) = 'u' && String.unsafe_get s (pos+12) = 'r' && String.unsafe_get s (pos+13) = 'l' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_text := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_proxy_icon_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "text" |]; + ( + { + text = !field_text; + icon_url = !field_icon_url; + proxy_icon_url = !field_proxy_icon_url; + } + : footer) + ) +) +let footer_of_string s = + read_footer (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_bool + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_field : _ -> field -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"value\":"; + ( + Yojson.Safe.write_string + ) + ob x.value; + (match x.inline with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"inline\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_field ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_field ob x; + Bi_outbuf.contents ob +let read_field = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_value = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_inline = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'v' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'u' && String.unsafe_get s (pos+4) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_value := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_inline := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'v' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'u' && String.unsafe_get s (pos+4) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_value := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_inline := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x3 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "name"; "value" |]; + ( + { + name = !field_name; + value = !field_value; + inline = !field_inline; + } + : field) + ) +) +let field_of_string s = + read_field (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__8 = ( + Atdgen_runtime.Oj_run.write_list ( + write_field + ) +) +let string_of__8 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__8 ob x; + Bi_outbuf.contents ob +let read__8 = ( + Atdgen_runtime.Oj_run.read_list ( + read_field + ) +) +let _8_of_string s = + read__8 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__9 = ( + Atdgen_runtime.Oj_run.write_option ( + write__8 + ) +) +let string_of__9 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__9 ob x; + Bi_outbuf.contents ob +let read__9 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__8 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__8 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _9_of_string s = + read__9 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__7 = ( + Atdgen_runtime.Oj_run.write_option ( + write_provider + ) +) +let string_of__7 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__7 ob x; + Bi_outbuf.contents ob +let read__7 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_provider + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_provider + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _7_of_string s = + read__7 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__6 = ( + Atdgen_runtime.Oj_run.write_option ( + write_video + ) +) +let string_of__6 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__6 ob x; + Bi_outbuf.contents ob +let read__6 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_video + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_video + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _6_of_string s = + read__6 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__5 = ( + Atdgen_runtime.Oj_run.write_option ( + write_image + ) +) +let string_of__5 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__5 ob x; + Bi_outbuf.contents ob +let read__5 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_image + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_image + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _5_of_string s = + read__5 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__4 = ( + Atdgen_runtime.Oj_run.write_option ( + write_footer + ) +) +let string_of__4 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__4 ob x; + Bi_outbuf.contents ob +let read__4 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_footer + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_footer + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _4_of_string s = + read__4 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.title with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"title\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.kind with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"kind\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.description with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"description\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.url with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"url\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.timestamp with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"timestamp\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.colour with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"colour\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.footer with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"footer\":"; + ( + write_footer + ) + ob x; + ); + (match x.image with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"image\":"; + ( + write_image + ) + ob x; + ); + (match x.thumbnail with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"thumbnail\":"; + ( + write_image + ) + ob x; + ); + (match x.video with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"video\":"; + ( + write_video + ) + ob x; + ); + (match x.provider with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"provider\":"; + ( + write_provider + ) + ob x; + ); + (match x.fields with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"fields\":"; + ( + write__8 + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_title = ref (None) in + let field_kind = ref (None) in + let field_description = ref (None) in + let field_url = ref (None) in + let field_timestamp = ref (None) in + let field_colour = ref (None) in + let field_footer = ref (None) in + let field_image = ref (None) in + let field_thumbnail = ref (None) in + let field_video = ref (None) in + let field_provider = ref (None) in + let field_fields = ref (None) in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 3 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'k' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'd' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 'v' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'o' then ( + 9 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'r' then ( + 5 + ) + else ( + -1 + ) + ) + | 'f' -> ( + match String.unsafe_get s (pos+1) with + | 'i' -> ( + if String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'v' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'r' then ( + 10 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 't' then ( + match String.unsafe_get s (pos+1) with + | 'h' -> ( + if String.unsafe_get s (pos+2) = 'u' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'b' && String.unsafe_get s (pos+5) = 'n' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'l' then ( + 8 + ) + else ( + -1 + ) + ) + | 'i' -> ( + if String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'p' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + ) + | 11 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'p' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_title := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_kind := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_description := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_timestamp := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_colour := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_footer := ( + Some ( + ( + read_footer + ) p lb + ) + ); + ) + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_image := ( + Some ( + ( + read_image + ) p lb + ) + ); + ) + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_thumbnail := ( + Some ( + ( + read_image + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_video := ( + Some ( + ( + read_video + ) p lb + ) + ); + ) + | 10 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_provider := ( + Some ( + ( + read_provider + ) p lb + ) + ); + ) + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_fields := ( + Some ( + ( + read__8 + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 3 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'l' then ( + 3 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'k' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'd' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | 'v' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'o' then ( + 9 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'r' then ( + 5 + ) + else ( + -1 + ) + ) + | 'f' -> ( + match String.unsafe_get s (pos+1) with + | 'i' -> ( + if String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'r' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'v' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'r' then ( + 10 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 't' then ( + match String.unsafe_get s (pos+1) with + | 'h' -> ( + if String.unsafe_get s (pos+2) = 'u' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'b' && String.unsafe_get s (pos+5) = 'n' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'l' then ( + 8 + ) + else ( + -1 + ) + ) + | 'i' -> ( + if String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'p' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + ) + | 11 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'p' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_title := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_kind := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_description := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_url := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_timestamp := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_colour := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_footer := ( + Some ( + ( + read_footer + ) p lb + ) + ); + ) + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_image := ( + Some ( + ( + read_image + ) p lb + ) + ); + ) + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_thumbnail := ( + Some ( + ( + read_image + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_video := ( + Some ( + ( + read_video + ) p lb + ) + ); + ) + | 10 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_provider := ( + Some ( + ( + read_provider + ) p lb + ) + ); + ) + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_fields := ( + Some ( + ( + read__8 + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + ( + { + title = !field_title; + kind = !field_kind; + description = !field_description; + url = !field_url; + timestamp = !field_timestamp; + colour = !field_colour; + footer = !field_footer; + image = !field_image; + thumbnail = !field_thumbnail; + video = !field_video; + provider = !field_provider; + fields = !field_fields; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/embed_j.mli b/lib/models/gen/embed_j.mli new file mode 100644 index 0000000..8872d89 --- /dev/null +++ b/lib/models/gen/embed_j.mli @@ -0,0 +1,168 @@ +(* Auto-generated from "embed.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type video = Embed_t.video = { + url: string option; + height: int option; + width: int option +} + +type provider = Embed_t.provider = { + name: string option; + url: string option +} + +type image = Embed_t.image = { + url: string option; + proxy_url: string option; + height: int option; + width: int option +} + +type footer = Embed_t.footer = { + text: string; + icon_url: string option; + proxy_icon_url: string option +} + +type field = Embed_t.field = { + name: string; + value: string; + inline: bool option +} + +type t = Embed_t.t = { + title: string option; + kind: string option; + description: string option; + url: string option; + timestamp: string option; + colour: int option; + footer: footer option; + image: image option; + thumbnail: image option; + video: video option; + provider: provider option; + fields: field list option +} + +val write_video : + Bi_outbuf.t -> video -> unit + (** Output a JSON value of type {!video}. *) + +val string_of_video : + ?len:int -> video -> string + (** Serialize a value of type {!video} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_video : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> video + (** Input JSON data of type {!video}. *) + +val video_of_string : + string -> video + (** Deserialize JSON data of type {!video}. *) + +val write_provider : + Bi_outbuf.t -> provider -> unit + (** Output a JSON value of type {!provider}. *) + +val string_of_provider : + ?len:int -> provider -> string + (** Serialize a value of type {!provider} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_provider : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> provider + (** Input JSON data of type {!provider}. *) + +val provider_of_string : + string -> provider + (** Deserialize JSON data of type {!provider}. *) + +val write_image : + Bi_outbuf.t -> image -> unit + (** Output a JSON value of type {!image}. *) + +val string_of_image : + ?len:int -> image -> string + (** Serialize a value of type {!image} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_image : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> image + (** Input JSON data of type {!image}. *) + +val image_of_string : + string -> image + (** Deserialize JSON data of type {!image}. *) + +val write_footer : + Bi_outbuf.t -> footer -> unit + (** Output a JSON value of type {!footer}. *) + +val string_of_footer : + ?len:int -> footer -> string + (** Serialize a value of type {!footer} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_footer : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> footer + (** Input JSON data of type {!footer}. *) + +val footer_of_string : + string -> footer + (** Deserialize JSON data of type {!footer}. *) + +val write_field : + Bi_outbuf.t -> field -> unit + (** Output a JSON value of type {!field}. *) + +val string_of_field : + ?len:int -> field -> string + (** Serialize a value of type {!field} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_field : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> field + (** Input JSON data of type {!field}. *) + +val field_of_string : + string -> field + (** Deserialize JSON data of type {!field}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/embed_t.ml b/lib/models/gen/embed_t.ml new file mode 100644 index 0000000..9eb5059 --- /dev/null +++ b/lib/models/gen/embed_t.ml @@ -0,0 +1,36 @@ +(* Auto-generated from "embed.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type video = { url: string option; height: int option; width: int option } + +type provider = { name: string option; url: string option } + +type image = { + url: string option; + proxy_url: string option; + height: int option; + width: int option +} + +type footer = { + text: string; + icon_url: string option; + proxy_icon_url: string option +} + +type field = { name: string; value: string; inline: bool option } + +type t = { + title: string option; + kind: string option; + description: string option; + url: string option; + timestamp: string option; + colour: int option; + footer: footer option; + image: image option; + thumbnail: image option; + video: video option; + provider: provider option; + fields: field list option +} diff --git a/lib/models/gen/embed_t.mli b/lib/models/gen/embed_t.mli new file mode 100644 index 0000000..9eb5059 --- /dev/null +++ b/lib/models/gen/embed_t.mli @@ -0,0 +1,36 @@ +(* Auto-generated from "embed.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type video = { url: string option; height: int option; width: int option } + +type provider = { name: string option; url: string option } + +type image = { + url: string option; + proxy_url: string option; + height: int option; + width: int option +} + +type footer = { + text: string; + icon_url: string option; + proxy_icon_url: string option +} + +type field = { name: string; value: string; inline: bool option } + +type t = { + title: string option; + kind: string option; + description: string option; + url: string option; + timestamp: string option; + colour: int option; + footer: footer option; + image: image option; + thumbnail: image option; + video: video option; + provider: provider option; + fields: field list option +} diff --git a/lib/models/gen/emoji.atd b/lib/models/gen/emoji.atd new file mode 100644 index 0000000..877323b --- /dev/null +++ b/lib/models/gen/emoji.atd @@ -0,0 +1,12 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract + +type t = { + ?id: snowflake option; + name: string; + ?roles: snowflake list option; + ?user: user option; + ?require_colons: bool option; + ?managed: bool option; + ?animated: bool option; +}
\ No newline at end of file diff --git a/lib/models/gen/emoji_j.ml b/lib/models/gen/emoji_j.ml new file mode 100644 index 0000000..d621de2 --- /dev/null +++ b/lib/models/gen/emoji_j.ml @@ -0,0 +1,701 @@ +(* Auto-generated from "emoji.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Emoji_t.t = { + id: snowflake option; + name: string; + roles: snowflake list option; + user: user option; + require_colons: bool option; + managed: bool option; + animated: bool option +} + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__5 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_bool + ) +) +let string_of__5 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__5 ob x; + Bi_outbuf.contents ob +let read__5 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _5_of_string s = + read__5 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__4 = ( + Atdgen_runtime.Oj_run.write_option ( + write_user + ) +) +let string_of__4 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__4 ob x; + Bi_outbuf.contents ob +let read__4 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_user + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_user + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _4_of_string s = + read__4 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_list ( + write_snowflake + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + Atdgen_runtime.Oj_run.read_list ( + read_snowflake + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_option ( + write__2 + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__2 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__2 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + write_snowflake + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + (match x.roles with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"roles\":"; + ( + write__2 + ) + ob x; + ); + (match x.user with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"user\":"; + ( + write_user + ) + ob x; + ); + (match x.require_colons with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"require_colons\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.managed with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"managed\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.animated with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"animated\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (None) in + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_roles = ref (None) in + let field_user = ref (None) in + let field_require_colons = ref (None) in + let field_managed = ref (None) in + let field_animated = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 2 + ) + else ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'q' && String.unsafe_get s (pos+3) = 'u' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'c' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = 'o' && String.unsafe_get s (pos+12) = 'n' && String.unsafe_get s (pos+13) = 's' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_roles := ( + Some ( + ( + read__2 + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_user := ( + Some ( + ( + read_user + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_require_colons := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_managed := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_animated := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 2 + ) + else ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 14 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'q' && String.unsafe_get s (pos+3) = 'u' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'c' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = 'o' && String.unsafe_get s (pos+12) = 'n' && String.unsafe_get s (pos+13) = 's' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_roles := ( + Some ( + ( + read__2 + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_user := ( + Some ( + ( + read_user + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_require_colons := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 5 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_managed := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_animated := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "name" |]; + ( + { + id = !field_id; + name = !field_name; + roles = !field_roles; + user = !field_user; + require_colons = !field_require_colons; + managed = !field_managed; + animated = !field_animated; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/emoji_j.mli b/lib/models/gen/emoji_j.mli new file mode 100644 index 0000000..596deeb --- /dev/null +++ b/lib/models/gen/emoji_j.mli @@ -0,0 +1,77 @@ +(* Auto-generated from "emoji.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Emoji_t.t = { + id: snowflake option; + name: string; + roles: snowflake list option; + user: user option; + require_colons: bool option; + managed: bool option; + animated: bool option +} + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/emoji_t.ml b/lib/models/gen/emoji_t.ml new file mode 100644 index 0000000..333939d --- /dev/null +++ b/lib/models/gen/emoji_t.ml @@ -0,0 +1,16 @@ +(* Auto-generated from "emoji.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake option; + name: string; + roles: snowflake list option; + user: user option; + require_colons: bool option; + managed: bool option; + animated: bool option +} diff --git a/lib/models/gen/emoji_t.mli b/lib/models/gen/emoji_t.mli new file mode 100644 index 0000000..333939d --- /dev/null +++ b/lib/models/gen/emoji_t.mli @@ -0,0 +1,16 @@ +(* Auto-generated from "emoji.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake option; + name: string; + roles: snowflake list option; + user: user option; + require_colons: bool option; + managed: bool option; + animated: bool option +} diff --git a/lib/models/gen/guild.atd b/lib/models/gen/guild.atd new file mode 100644 index 0000000..c622eea --- /dev/null +++ b/lib/models/gen/guild.atd @@ -0,0 +1,36 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract +type member <ocaml from="Member" t="t"> = abstract +type role <ocaml from="Role" t="t"> = abstract +type channel <ocaml from="Channel" t="t"> = abstract +type emoji <ocaml from="Emoji" t="t"> = abstract + + +type t = { + id: snowflake; + name: string; + ?icon: string option; + ?splash: string option; + owner_id: snowflake; + region: string; + ?afk_channel_id: snowflake option; + afk_timeout: int; + ?embed_enabled: bool option; + ?embed_channel_id: snowflake option; + verification_level: int; + default_message_notifications: int; + explicit_content_filter: int; + roles: role list; + emojis: emoji list; + features: string list; + mfa_level: int; + ?application_id: snowflake option; + ?widget_enabled: bool option; + ?widget_channel: channel option; + ?system_channel: channel option; + ?large: bool option; + ?unavailable: bool option; + ?member_count: int option; + ?members: member list option; + ?channels: channel list option; +}
\ No newline at end of file diff --git a/lib/models/gen/guild_j.ml b/lib/models/gen/guild_j.ml new file mode 100644 index 0000000..9f7b069 --- /dev/null +++ b/lib/models/gen/guild_j.ml @@ -0,0 +1,1948 @@ +(* Auto-generated from "guild.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type role = Role_t.t + +type member = Member_t.t + +type emoji = Emoji_t.t + +type channel = Channel_t.t + +type t = Guild_t.t = { + id: snowflake; + name: string; + icon: string option; + splash: string option; + owner_id: snowflake; + region: string; + afk_channel_id: snowflake option; + afk_timeout: int; + embed_enabled: bool option; + embed_channel_id: snowflake option; + verification_level: int; + default_message_notifications: int; + explicit_content_filter: int; + roles: role list; + emojis: emoji list; + features: string list; + mfa_level: int; + application_id: snowflake option; + widget_enabled: bool option; + widget_channel: channel option; + system_channel: channel option; + large: bool option; + unavailable: bool option; + member_count: int option; + members: member list option; + channels: channel list option +} + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_role = ( + Role_j.write_t +) +let string_of_role ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_role ob x; + Bi_outbuf.contents ob +let read_role = ( + Role_j.read_t +) +let role_of_string s = + read_role (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_member = ( + Member_j.write_t +) +let string_of_member ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_member ob x; + Bi_outbuf.contents ob +let read_member = ( + Member_j.read_t +) +let member_of_string s = + read_member (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_emoji = ( + Emoji_j.write_t +) +let string_of_emoji ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_emoji ob x; + Bi_outbuf.contents ob +let read_emoji = ( + Emoji_j.read_t +) +let emoji_of_string s = + read_emoji (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_channel = ( + Channel_j.write_t +) +let string_of_channel ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_channel ob x; + Bi_outbuf.contents ob +let read_channel = ( + Channel_j.read_t +) +let channel_of_string s = + read_channel (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__9 = ( + Atdgen_runtime.Oj_run.write_list ( + write_member + ) +) +let string_of__9 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__9 ob x; + Bi_outbuf.contents ob +let read__9 = ( + Atdgen_runtime.Oj_run.read_list ( + read_member + ) +) +let _9_of_string s = + read__9 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__8 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_int + ) +) +let string_of__8 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__8 ob x; + Bi_outbuf.contents ob +let read__8 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_int + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _8_of_string s = + read__8 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__7 = ( + Atdgen_runtime.Oj_run.write_option ( + write_channel + ) +) +let string_of__7 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__7 ob x; + Bi_outbuf.contents ob +let read__7 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_channel + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_channel + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _7_of_string s = + read__7 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__6 = ( + Atdgen_runtime.Oj_run.write_list ( + Yojson.Safe.write_string + ) +) +let string_of__6 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__6 ob x; + Bi_outbuf.contents ob +let read__6 = ( + Atdgen_runtime.Oj_run.read_list ( + Atdgen_runtime.Oj_run.read_string + ) +) +let _6_of_string s = + read__6 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__5 = ( + Atdgen_runtime.Oj_run.write_list ( + write_emoji + ) +) +let string_of__5 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__5 ob x; + Bi_outbuf.contents ob +let read__5 = ( + Atdgen_runtime.Oj_run.read_list ( + read_emoji + ) +) +let _5_of_string s = + read__5 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__4 = ( + Atdgen_runtime.Oj_run.write_list ( + write_role + ) +) +let string_of__4 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__4 ob x; + Bi_outbuf.contents ob +let read__4 = ( + Atdgen_runtime.Oj_run.read_list ( + read_role + ) +) +let _4_of_string s = + read__4 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_bool + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_option ( + write_snowflake + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__11 = ( + Atdgen_runtime.Oj_run.write_list ( + write_channel + ) +) +let string_of__11 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__11 ob x; + Bi_outbuf.contents ob +let read__11 = ( + Atdgen_runtime.Oj_run.read_list ( + read_channel + ) +) +let _11_of_string s = + read__11 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__12 = ( + Atdgen_runtime.Oj_run.write_option ( + write__11 + ) +) +let string_of__12 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__12 ob x; + Bi_outbuf.contents ob +let read__12 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__11 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__11 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _12_of_string s = + read__12 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__10 = ( + Atdgen_runtime.Oj_run.write_option ( + write__9 + ) +) +let string_of__10 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__10 ob x; + Bi_outbuf.contents ob +let read__10 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__9 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__9 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _10_of_string s = + read__10 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + (match x.icon with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"icon\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + (match x.splash with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"splash\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"owner_id\":"; + ( + write_snowflake + ) + ob x.owner_id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"region\":"; + ( + Yojson.Safe.write_string + ) + ob x.region; + (match x.afk_channel_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"afk_channel_id\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"afk_timeout\":"; + ( + Yojson.Safe.write_int + ) + ob x.afk_timeout; + (match x.embed_enabled with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"embed_enabled\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.embed_channel_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"embed_channel_id\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"verification_level\":"; + ( + Yojson.Safe.write_int + ) + ob x.verification_level; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"default_message_notifications\":"; + ( + Yojson.Safe.write_int + ) + ob x.default_message_notifications; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"explicit_content_filter\":"; + ( + Yojson.Safe.write_int + ) + ob x.explicit_content_filter; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"roles\":"; + ( + write__4 + ) + ob x.roles; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"emojis\":"; + ( + write__5 + ) + ob x.emojis; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"features\":"; + ( + write__6 + ) + ob x.features; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mfa_level\":"; + ( + Yojson.Safe.write_int + ) + ob x.mfa_level; + (match x.application_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"application_id\":"; + ( + write_snowflake + ) + ob x; + ); + (match x.widget_enabled with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"widget_enabled\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.widget_channel with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"widget_channel\":"; + ( + write_channel + ) + ob x; + ); + (match x.system_channel with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"system_channel\":"; + ( + write_channel + ) + ob x; + ); + (match x.large with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"large\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.unavailable with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"unavailable\":"; + ( + Yojson.Safe.write_bool + ) + ob x; + ); + (match x.member_count with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"member_count\":"; + ( + Yojson.Safe.write_int + ) + ob x; + ); + (match x.members with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"members\":"; + ( + write__9 + ) + ob x; + ); + (match x.channels with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"channels\":"; + ( + write__11 + ) + ob x; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_icon = ref (None) in + let field_splash = ref (None) in + let field_owner_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_region = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_afk_channel_id = ref (None) in + let field_afk_timeout = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_embed_enabled = ref (None) in + let field_embed_channel_id = ref (None) in + let field_verification_level = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_default_message_notifications = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_explicit_content_filter = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_roles = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_emojis = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_features = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mfa_level = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_application_id = ref (None) in + let field_widget_enabled = ref (None) in + let field_widget_channel = ref (None) in + let field_system_channel = ref (None) in + let field_large = ref (None) in + let field_unavailable = ref (None) in + let field_member_count = ref (None) in + let field_members = ref (None) in + let field_channels = ref (None) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' then ( + 2 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'l' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' then ( + 21 + ) + else ( + -1 + ) + ) + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 13 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'j' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' then ( + 14 + ) + else ( + -1 + ) + ) + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'g' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'n' then ( + 5 + ) + else ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+1) = 'p' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 'h' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 's' then ( + 24 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'h' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = 's' then ( + 25 + ) + else ( + -1 + ) + ) + | 'f' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 's' then ( + 15 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+1) = 'w' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'f' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 'l' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'v' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'l' then ( + 16 + ) + else ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + if String.unsafe_get s (pos+1) = 'f' && String.unsafe_get s (pos+2) = 'k' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'u' && String.unsafe_get s (pos+10) = 't' then ( + 7 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'v' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 22 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 12 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'u' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 't' then ( + 23 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 'a' && String.unsafe_get s (pos+9) = 'b' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = 'e' && String.unsafe_get s (pos+12) = 'd' then ( + 8 + ) + else ( + -1 + ) + ) + | 14 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + match String.unsafe_get s (pos+1) with + | 'f' -> ( + if String.unsafe_get s (pos+2) = 'k' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 'c' && String.unsafe_get s (pos+5) = 'h' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'e' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 17 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'm' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'h' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'l' then ( + 20 + ) + else ( + -1 + ) + ) + | 'w' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = '_' then ( + match String.unsafe_get s (pos+7) with + | 'c' -> ( + if String.unsafe_get s (pos+8) = 'h' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'l' then ( + 19 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'b' && String.unsafe_get s (pos+11) = 'l' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'd' then ( + 18 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 16 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'c' && String.unsafe_get s (pos+7) = 'h' && String.unsafe_get s (pos+8) = 'a' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'e' && String.unsafe_get s (pos+12) = 'l' && String.unsafe_get s (pos+13) = '_' && String.unsafe_get s (pos+14) = 'i' && String.unsafe_get s (pos+15) = 'd' then ( + 9 + ) + else ( + -1 + ) + ) + | 18 -> ( + if String.unsafe_get s pos = 'v' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'f' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'c' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 'i' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = '_' && String.unsafe_get s (pos+13) = 'l' && String.unsafe_get s (pos+14) = 'e' && String.unsafe_get s (pos+15) = 'v' && String.unsafe_get s (pos+16) = 'e' && String.unsafe_get s (pos+17) = 'l' then ( + 10 + ) + else ( + -1 + ) + ) + | 23 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'x' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = '_' && String.unsafe_get s (pos+9) = 'c' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 't' && String.unsafe_get s (pos+13) = 'e' && String.unsafe_get s (pos+14) = 'n' && String.unsafe_get s (pos+15) = 't' && String.unsafe_get s (pos+16) = '_' && String.unsafe_get s (pos+17) = 'f' && String.unsafe_get s (pos+18) = 'i' && String.unsafe_get s (pos+19) = 'l' && String.unsafe_get s (pos+20) = 't' && String.unsafe_get s (pos+21) = 'e' && String.unsafe_get s (pos+22) = 'r' then ( + 12 + ) + else ( + -1 + ) + ) + | 29 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'f' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'l' && String.unsafe_get s (pos+6) = 't' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'm' && String.unsafe_get s (pos+9) = 'e' && String.unsafe_get s (pos+10) = 's' && String.unsafe_get s (pos+11) = 's' && String.unsafe_get s (pos+12) = 'a' && String.unsafe_get s (pos+13) = 'g' && String.unsafe_get s (pos+14) = 'e' && String.unsafe_get s (pos+15) = '_' && String.unsafe_get s (pos+16) = 'n' && String.unsafe_get s (pos+17) = 'o' && String.unsafe_get s (pos+18) = 't' && String.unsafe_get s (pos+19) = 'i' && String.unsafe_get s (pos+20) = 'f' && String.unsafe_get s (pos+21) = 'i' && String.unsafe_get s (pos+22) = 'c' && String.unsafe_get s (pos+23) = 'a' && String.unsafe_get s (pos+24) = 't' && String.unsafe_get s (pos+25) = 'i' && String.unsafe_get s (pos+26) = 'o' && String.unsafe_get s (pos+27) = 'n' && String.unsafe_get s (pos+28) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_splash := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + field_owner_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 5 -> + field_region := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_afk_channel_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 7 -> + field_afk_timeout := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_embed_enabled := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_embed_channel_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 10 -> + field_verification_level := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 11 -> + field_default_message_notifications := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 12 -> + field_explicit_content_filter := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 13 -> + field_roles := ( + ( + read__4 + ) p lb + ); + bits0 := !bits0 lor 0x100; + | 14 -> + field_emojis := ( + ( + read__5 + ) p lb + ); + bits0 := !bits0 lor 0x200; + | 15 -> + field_features := ( + ( + read__6 + ) p lb + ); + bits0 := !bits0 lor 0x400; + | 16 -> + field_mfa_level := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x800; + | 17 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_application_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 18 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_widget_enabled := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 19 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_widget_channel := ( + Some ( + ( + read_channel + ) p lb + ) + ); + ) + | 20 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_system_channel := ( + Some ( + ( + read_channel + ) p lb + ) + ); + ) + | 21 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_large := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 22 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_unavailable := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 23 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_member_count := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 24 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_members := ( + Some ( + ( + read__9 + ) p lb + ) + ); + ) + | 25 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_channels := ( + Some ( + ( + read__11 + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + match String.unsafe_get s pos with + | 'i' -> ( + if String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'n' then ( + 2 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'l' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' then ( + 21 + ) + else ( + -1 + ) + ) + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 13 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'j' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' then ( + 14 + ) + else ( + -1 + ) + ) + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'g' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'n' then ( + 5 + ) + else ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+1) = 'p' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 'h' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 's' then ( + 24 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'h' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = 's' then ( + 25 + ) + else ( + -1 + ) + ) + | 'f' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 's' then ( + 15 + ) + else ( + -1 + ) + ) + | 'o' -> ( + if String.unsafe_get s (pos+1) = 'w' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'f' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 'l' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'v' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'l' then ( + 16 + ) + else ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + if String.unsafe_get s (pos+1) = 'f' && String.unsafe_get s (pos+2) = 'k' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'u' && String.unsafe_get s (pos+10) = 't' then ( + 7 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 'n' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'v' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 22 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 12 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'u' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 't' then ( + 23 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 'a' && String.unsafe_get s (pos+9) = 'b' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = 'e' && String.unsafe_get s (pos+12) = 'd' then ( + 8 + ) + else ( + -1 + ) + ) + | 14 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + match String.unsafe_get s (pos+1) with + | 'f' -> ( + if String.unsafe_get s (pos+2) = 'k' && String.unsafe_get s (pos+3) = '_' && String.unsafe_get s (pos+4) = 'c' && String.unsafe_get s (pos+5) = 'h' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'e' && String.unsafe_get s (pos+10) = 'l' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'o' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = '_' && String.unsafe_get s (pos+12) = 'i' && String.unsafe_get s (pos+13) = 'd' then ( + 17 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 's' -> ( + if String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'm' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'c' && String.unsafe_get s (pos+8) = 'h' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'l' then ( + 20 + ) + else ( + -1 + ) + ) + | 'w' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'd' && String.unsafe_get s (pos+3) = 'g' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = '_' then ( + match String.unsafe_get s (pos+7) with + | 'c' -> ( + if String.unsafe_get s (pos+8) = 'h' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'l' then ( + 19 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 'b' && String.unsafe_get s (pos+11) = 'l' && String.unsafe_get s (pos+12) = 'e' && String.unsafe_get s (pos+13) = 'd' then ( + 18 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 16 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'c' && String.unsafe_get s (pos+7) = 'h' && String.unsafe_get s (pos+8) = 'a' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 'n' && String.unsafe_get s (pos+11) = 'e' && String.unsafe_get s (pos+12) = 'l' && String.unsafe_get s (pos+13) = '_' && String.unsafe_get s (pos+14) = 'i' && String.unsafe_get s (pos+15) = 'd' then ( + 9 + ) + else ( + -1 + ) + ) + | 18 -> ( + if String.unsafe_get s pos = 'v' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'f' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'c' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 'i' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = '_' && String.unsafe_get s (pos+13) = 'l' && String.unsafe_get s (pos+14) = 'e' && String.unsafe_get s (pos+15) = 'v' && String.unsafe_get s (pos+16) = 'e' && String.unsafe_get s (pos+17) = 'l' then ( + 10 + ) + else ( + -1 + ) + ) + | 23 -> ( + if String.unsafe_get s pos = 'e' && String.unsafe_get s (pos+1) = 'x' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'c' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = '_' && String.unsafe_get s (pos+9) = 'c' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 't' && String.unsafe_get s (pos+13) = 'e' && String.unsafe_get s (pos+14) = 'n' && String.unsafe_get s (pos+15) = 't' && String.unsafe_get s (pos+16) = '_' && String.unsafe_get s (pos+17) = 'f' && String.unsafe_get s (pos+18) = 'i' && String.unsafe_get s (pos+19) = 'l' && String.unsafe_get s (pos+20) = 't' && String.unsafe_get s (pos+21) = 'e' && String.unsafe_get s (pos+22) = 'r' then ( + 12 + ) + else ( + -1 + ) + ) + | 29 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'f' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 'l' && String.unsafe_get s (pos+6) = 't' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'm' && String.unsafe_get s (pos+9) = 'e' && String.unsafe_get s (pos+10) = 's' && String.unsafe_get s (pos+11) = 's' && String.unsafe_get s (pos+12) = 'a' && String.unsafe_get s (pos+13) = 'g' && String.unsafe_get s (pos+14) = 'e' && String.unsafe_get s (pos+15) = '_' && String.unsafe_get s (pos+16) = 'n' && String.unsafe_get s (pos+17) = 'o' && String.unsafe_get s (pos+18) = 't' && String.unsafe_get s (pos+19) = 'i' && String.unsafe_get s (pos+20) = 'f' && String.unsafe_get s (pos+21) = 'i' && String.unsafe_get s (pos+22) = 'c' && String.unsafe_get s (pos+23) = 'a' && String.unsafe_get s (pos+24) = 't' && String.unsafe_get s (pos+25) = 'i' && String.unsafe_get s (pos+26) = 'o' && String.unsafe_get s (pos+27) = 'n' && String.unsafe_get s (pos+28) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_icon := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_splash := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + field_owner_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 5 -> + field_region := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 6 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_afk_channel_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 7 -> + field_afk_timeout := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 8 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_embed_enabled := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 9 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_embed_channel_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 10 -> + field_verification_level := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 11 -> + field_default_message_notifications := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 12 -> + field_explicit_content_filter := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 13 -> + field_roles := ( + ( + read__4 + ) p lb + ); + bits0 := !bits0 lor 0x100; + | 14 -> + field_emojis := ( + ( + read__5 + ) p lb + ); + bits0 := !bits0 lor 0x200; + | 15 -> + field_features := ( + ( + read__6 + ) p lb + ); + bits0 := !bits0 lor 0x400; + | 16 -> + field_mfa_level := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x800; + | 17 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_application_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 18 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_widget_enabled := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 19 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_widget_channel := ( + Some ( + ( + read_channel + ) p lb + ) + ); + ) + | 20 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_system_channel := ( + Some ( + ( + read_channel + ) p lb + ) + ); + ) + | 21 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_large := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 22 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_unavailable := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ) + ); + ) + | 23 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_member_count := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ) + ); + ) + | 24 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_members := ( + Some ( + ( + read__9 + ) p lb + ) + ); + ) + | 25 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_channels := ( + Some ( + ( + read__11 + ) p lb + ) + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0xfff then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "name"; "owner_id"; "region"; "afk_timeout"; "verification_level"; "default_message_notifications"; "explicit_content_filter"; "roles"; "emojis"; "features"; "mfa_level" |]; + ( + { + id = !field_id; + name = !field_name; + icon = !field_icon; + splash = !field_splash; + owner_id = !field_owner_id; + region = !field_region; + afk_channel_id = !field_afk_channel_id; + afk_timeout = !field_afk_timeout; + embed_enabled = !field_embed_enabled; + embed_channel_id = !field_embed_channel_id; + verification_level = !field_verification_level; + default_message_notifications = !field_default_message_notifications; + explicit_content_filter = !field_explicit_content_filter; + roles = !field_roles; + emojis = !field_emojis; + features = !field_features; + mfa_level = !field_mfa_level; + application_id = !field_application_id; + widget_enabled = !field_widget_enabled; + widget_channel = !field_widget_channel; + system_channel = !field_system_channel; + large = !field_large; + unavailable = !field_unavailable; + member_count = !field_member_count; + members = !field_members; + channels = !field_channels; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/guild_j.mli b/lib/models/gen/guild_j.mli new file mode 100644 index 0000000..d430b2a --- /dev/null +++ b/lib/models/gen/guild_j.mli @@ -0,0 +1,184 @@ +(* Auto-generated from "guild.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type role = Role_t.t + +type member = Member_t.t + +type emoji = Emoji_t.t + +type channel = Channel_t.t + +type t = Guild_t.t = { + id: snowflake; + name: string; + icon: string option; + splash: string option; + owner_id: snowflake; + region: string; + afk_channel_id: snowflake option; + afk_timeout: int; + embed_enabled: bool option; + embed_channel_id: snowflake option; + verification_level: int; + default_message_notifications: int; + explicit_content_filter: int; + roles: role list; + emojis: emoji list; + features: string list; + mfa_level: int; + application_id: snowflake option; + widget_enabled: bool option; + widget_channel: channel option; + system_channel: channel option; + large: bool option; + unavailable: bool option; + member_count: int option; + members: member list option; + channels: channel list option +} + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_role : + Bi_outbuf.t -> role -> unit + (** Output a JSON value of type {!role}. *) + +val string_of_role : + ?len:int -> role -> string + (** Serialize a value of type {!role} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_role : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> role + (** Input JSON data of type {!role}. *) + +val role_of_string : + string -> role + (** Deserialize JSON data of type {!role}. *) + +val write_member : + Bi_outbuf.t -> member -> unit + (** Output a JSON value of type {!member}. *) + +val string_of_member : + ?len:int -> member -> string + (** Serialize a value of type {!member} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_member : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> member + (** Input JSON data of type {!member}. *) + +val member_of_string : + string -> member + (** Deserialize JSON data of type {!member}. *) + +val write_emoji : + Bi_outbuf.t -> emoji -> unit + (** Output a JSON value of type {!emoji}. *) + +val string_of_emoji : + ?len:int -> emoji -> string + (** Serialize a value of type {!emoji} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_emoji : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> emoji + (** Input JSON data of type {!emoji}. *) + +val emoji_of_string : + string -> emoji + (** Deserialize JSON data of type {!emoji}. *) + +val write_channel : + Bi_outbuf.t -> channel -> unit + (** Output a JSON value of type {!channel}. *) + +val string_of_channel : + ?len:int -> channel -> string + (** Serialize a value of type {!channel} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_channel : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> channel + (** Input JSON data of type {!channel}. *) + +val channel_of_string : + string -> channel + (** Deserialize JSON data of type {!channel}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/guild_t.ml b/lib/models/gen/guild_t.ml new file mode 100644 index 0000000..9ffe83f --- /dev/null +++ b/lib/models/gen/guild_t.ml @@ -0,0 +1,43 @@ +(* Auto-generated from "guild.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type role = Role_t.t + +type member = Member_t.t + +type emoji = Emoji_t.t + +type channel = Channel_t.t + +type t = { + id: snowflake; + name: string; + icon: string option; + splash: string option; + owner_id: snowflake; + region: string; + afk_channel_id: snowflake option; + afk_timeout: int; + embed_enabled: bool option; + embed_channel_id: snowflake option; + verification_level: int; + default_message_notifications: int; + explicit_content_filter: int; + roles: role list; + emojis: emoji list; + features: string list; + mfa_level: int; + application_id: snowflake option; + widget_enabled: bool option; + widget_channel: channel option; + system_channel: channel option; + large: bool option; + unavailable: bool option; + member_count: int option; + members: member list option; + channels: channel list option +} diff --git a/lib/models/gen/guild_t.mli b/lib/models/gen/guild_t.mli new file mode 100644 index 0000000..9ffe83f --- /dev/null +++ b/lib/models/gen/guild_t.mli @@ -0,0 +1,43 @@ +(* Auto-generated from "guild.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type role = Role_t.t + +type member = Member_t.t + +type emoji = Emoji_t.t + +type channel = Channel_t.t + +type t = { + id: snowflake; + name: string; + icon: string option; + splash: string option; + owner_id: snowflake; + region: string; + afk_channel_id: snowflake option; + afk_timeout: int; + embed_enabled: bool option; + embed_channel_id: snowflake option; + verification_level: int; + default_message_notifications: int; + explicit_content_filter: int; + roles: role list; + emojis: emoji list; + features: string list; + mfa_level: int; + application_id: snowflake option; + widget_enabled: bool option; + widget_channel: channel option; + system_channel: channel option; + large: bool option; + unavailable: bool option; + member_count: int option; + members: member list option; + channels: channel list option +} diff --git a/lib/models/gen/member.atd b/lib/models/gen/member.atd new file mode 100644 index 0000000..11d8b62 --- /dev/null +++ b/lib/models/gen/member.atd @@ -0,0 +1,15 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract + +type partial_member = { + ?nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool; +} + +type t = { + inherit partial_member; + user: user; +}
\ No newline at end of file diff --git a/lib/models/gen/member_j.ml b/lib/models/gen/member_j.ml new file mode 100644 index 0000000..7fd4aec --- /dev/null +++ b/lib/models/gen/member_j.ml @@ -0,0 +1,750 @@ +(* Auto-generated from "member.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Member_t.t = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool; + user: user +} + +type partial_member = Member_t.partial_member = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool +} + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_list ( + write_snowflake + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + Atdgen_runtime.Oj_run.read_list ( + read_snowflake + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.nick with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"nick\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"roles\":"; + ( + write__2 + ) + ob x.roles; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"joined_at\":"; + ( + Yojson.Safe.write_string + ) + ob x.joined_at; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"deaf\":"; + ( + Yojson.Safe.write_bool + ) + ob x.deaf; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mute\":"; + ( + Yojson.Safe.write_bool + ) + ob x.mute; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"user\":"; + ( + write_user + ) + ob x.user; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_nick = ref (None) in + let field_roles = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_joined_at = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_deaf = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mute = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_user = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'd' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'f' then ( + 3 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'k' then ( + 0 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'j' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nick := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_roles := ( + ( + read__2 + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + field_joined_at := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 3 -> + field_deaf := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_mute := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 5 -> + field_user := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x10; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'd' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'f' then ( + 3 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'k' then ( + 0 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'j' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nick := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_roles := ( + ( + read__2 + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + field_joined_at := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 3 -> + field_deaf := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_mute := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 5 -> + field_user := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x10; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1f then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "roles"; "joined_at"; "deaf"; "mute"; "user" |]; + ( + { + nick = !field_nick; + roles = !field_roles; + joined_at = !field_joined_at; + deaf = !field_deaf; + mute = !field_mute; + user = !field_user; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_partial_member : _ -> partial_member -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + (match x.nick with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"nick\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"roles\":"; + ( + write__2 + ) + ob x.roles; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"joined_at\":"; + ( + Yojson.Safe.write_string + ) + ob x.joined_at; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"deaf\":"; + ( + Yojson.Safe.write_bool + ) + ob x.deaf; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mute\":"; + ( + Yojson.Safe.write_bool + ) + ob x.mute; + Bi_outbuf.add_char ob '}'; +) +let string_of_partial_member ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_partial_member ob x; + Bi_outbuf.contents ob +let read_partial_member = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_nick = ref (None) in + let field_roles = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_joined_at = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_deaf = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mute = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'd' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'f' then ( + 3 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'k' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'j' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nick := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_roles := ( + ( + read__2 + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + field_joined_at := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 3 -> + field_deaf := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_mute := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'd' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'f' then ( + 3 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'e' then ( + 4 + ) + else ( + -1 + ) + ) + | 'n' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'c' && String.unsafe_get s (pos+3) = 'k' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 9 -> ( + if String.unsafe_get s pos = 'j' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 't' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nick := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 1 -> + field_roles := ( + ( + read__2 + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 2 -> + field_joined_at := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 3 -> + field_deaf := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_mute := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0xf then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "roles"; "joined_at"; "deaf"; "mute" |]; + ( + { + nick = !field_nick; + roles = !field_roles; + joined_at = !field_joined_at; + deaf = !field_deaf; + mute = !field_mute; + } + : partial_member) + ) +) +let partial_member_of_string s = + read_partial_member (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/member_j.mli b/lib/models/gen/member_j.mli new file mode 100644 index 0000000..f160b6d --- /dev/null +++ b/lib/models/gen/member_j.mli @@ -0,0 +1,104 @@ +(* Auto-generated from "member.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = Member_t.t = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool; + user: user +} + +type partial_member = Member_t.partial_member = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool +} + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + +val write_partial_member : + Bi_outbuf.t -> partial_member -> unit + (** Output a JSON value of type {!partial_member}. *) + +val string_of_partial_member : + ?len:int -> partial_member -> string + (** Serialize a value of type {!partial_member} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_partial_member : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> partial_member + (** Input JSON data of type {!partial_member}. *) + +val partial_member_of_string : + string -> partial_member + (** Deserialize JSON data of type {!partial_member}. *) + diff --git a/lib/models/gen/member_t.ml b/lib/models/gen/member_t.ml new file mode 100644 index 0000000..6262e1b --- /dev/null +++ b/lib/models/gen/member_t.ml @@ -0,0 +1,23 @@ +(* Auto-generated from "member.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool; + user: user +} + +type partial_member = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool +} diff --git a/lib/models/gen/member_t.mli b/lib/models/gen/member_t.mli new file mode 100644 index 0000000..6262e1b --- /dev/null +++ b/lib/models/gen/member_t.mli @@ -0,0 +1,23 @@ +(* Auto-generated from "member.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type t = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool; + user: user +} + +type partial_member = { + nick: string option; + roles: snowflake list; + joined_at: string; + deaf: bool; + mute: bool +} diff --git a/lib/models/gen/message.atd b/lib/models/gen/message.atd new file mode 100644 index 0000000..8611f6a --- /dev/null +++ b/lib/models/gen/message.atd @@ -0,0 +1,29 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract +type member <ocaml from="Member" t="t"> = abstract +type partial_member <ocaml from="Member" t="partial_member"> = abstract +type attachment <ocaml from="Attachment" t="t"> = abstract +type embed <ocaml from="Embed" t="t"> = abstract +type reaction <ocaml from="Reaction" t="t"> = abstract + +type t = { + id: snowflake; + author: user; + channel_id: snowflake; + ?member: partial_member option; + ?guild_id: snowflake option; + content: string; + timestamp: string; + ?edited_timestamp: string option; + tts: bool; + mention_everyone: bool; + mentions: snowflake list; + ?role_mentions: snowflake list option; + attachments: attachment list; + embeds: embed list; + ?reactions: snowflake list option; + ?nonce: snowflake option; + pinned: bool; + ?webhook_id: snowflake option; + kind <json name="type">: int; +}
\ No newline at end of file diff --git a/lib/models/gen/message_j.ml b/lib/models/gen/message_j.ml new file mode 100644 index 0000000..faea836 --- /dev/null +++ b/lib/models/gen/message_j.ml @@ -0,0 +1,1363 @@ +(* Auto-generated from "message.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_member = Member_t.partial_member + +type embed = Embed_t.t + +type attachment = Attachment_t.t + +type t = Message_t.t = { + id: snowflake; + author: user; + channel_id: snowflake; + member: partial_member option; + guild_id: snowflake option; + content: string; + timestamp: string; + edited_timestamp: string option; + tts: bool; + mention_everyone: bool; + mentions: snowflake list; + role_mentions: snowflake list option; + attachments: attachment list; + embeds: embed list; + reactions: snowflake list option; + nonce: snowflake option; + pinned: bool; + webhook_id: snowflake option; + kind: int +} + +type reaction = Reaction_t.t + +type member = Member_t.t + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_partial_member = ( + Member_j.write_partial_member +) +let string_of_partial_member ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_partial_member ob x; + Bi_outbuf.contents ob +let read_partial_member = ( + Member_j.read_partial_member +) +let partial_member_of_string s = + read_partial_member (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_embed = ( + Embed_j.write_t +) +let string_of_embed ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_embed ob x; + Bi_outbuf.contents ob +let read_embed = ( + Embed_j.read_t +) +let embed_of_string s = + read_embed (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_attachment = ( + Attachment_j.write_t +) +let string_of_attachment ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_attachment ob x; + Bi_outbuf.contents ob +let read_attachment = ( + Attachment_j.read_t +) +let attachment_of_string s = + read_attachment (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__7 = ( + Atdgen_runtime.Oj_run.write_list ( + write_embed + ) +) +let string_of__7 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__7 ob x; + Bi_outbuf.contents ob +let read__7 = ( + Atdgen_runtime.Oj_run.read_list ( + read_embed + ) +) +let _7_of_string s = + read__7 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__6 = ( + Atdgen_runtime.Oj_run.write_list ( + write_attachment + ) +) +let string_of__6 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__6 ob x; + Bi_outbuf.contents ob +let read__6 = ( + Atdgen_runtime.Oj_run.read_list ( + read_attachment + ) +) +let _6_of_string s = + read__6 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__4 = ( + Atdgen_runtime.Oj_run.write_list ( + write_snowflake + ) +) +let string_of__4 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__4 ob x; + Bi_outbuf.contents ob +let read__4 = ( + Atdgen_runtime.Oj_run.read_list ( + read_snowflake + ) +) +let _4_of_string s = + read__4 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__5 = ( + Atdgen_runtime.Oj_run.write_option ( + write__4 + ) +) +let string_of__5 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__5 ob x; + Bi_outbuf.contents ob +let read__5 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read__4 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read__4 + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _5_of_string s = + read__5 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_option ( + write_snowflake + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_snowflake + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + write_partial_member + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_partial_member + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_partial_member + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"author\":"; + ( + write_user + ) + ob x.author; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"channel_id\":"; + ( + write_snowflake + ) + ob x.channel_id; + (match x.member with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"member\":"; + ( + write_partial_member + ) + ob x; + ); + (match x.guild_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"guild_id\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"content\":"; + ( + Yojson.Safe.write_string + ) + ob x.content; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"timestamp\":"; + ( + Yojson.Safe.write_string + ) + ob x.timestamp; + (match x.edited_timestamp with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"edited_timestamp\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"tts\":"; + ( + Yojson.Safe.write_bool + ) + ob x.tts; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mention_everyone\":"; + ( + Yojson.Safe.write_bool + ) + ob x.mention_everyone; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mentions\":"; + ( + write__4 + ) + ob x.mentions; + (match x.role_mentions with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"role_mentions\":"; + ( + write__4 + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"attachments\":"; + ( + write__6 + ) + ob x.attachments; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"embeds\":"; + ( + write__7 + ) + ob x.embeds; + (match x.reactions with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"reactions\":"; + ( + write__4 + ) + ob x; + ); + (match x.nonce with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"nonce\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"pinned\":"; + ( + Yojson.Safe.write_bool + ) + ob x.pinned; + (match x.webhook_id with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"webhook_id\":"; + ( + write_snowflake + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"type\":"; + ( + Yojson.Safe.write_int + ) + ob x.kind; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_author = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_channel_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_member = ref (None) in + let field_guild_id = ref (None) in + let field_content = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_timestamp = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_edited_timestamp = ref (None) in + let field_tts = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mention_everyone = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mentions = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_role_mentions = ref (None) in + let field_attachments = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_embeds = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_reactions = ref (None) in + let field_nonce = ref (None) in + let field_pinned = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_webhook_id = ref (None) in + let field_kind = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 's' then ( + 8 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 18 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'e' then ( + 15 + ) + else ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'h' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'r' then ( + 1 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = 's' then ( + 13 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' then ( + 16 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'c' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'n' && String.unsafe_get s (pos+6) = 't' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 4 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 's' then ( + 10 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + match String.unsafe_get s pos with + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 's' then ( + 14 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'p' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 10 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'h' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'd' then ( + 2 + ) + else ( + -1 + ) + ) + | 'w' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'h' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'k' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'd' then ( + 17 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 11 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'c' && String.unsafe_get s (pos+5) = 'h' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 't' && String.unsafe_get s (pos+10) = 's' then ( + 12 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'm' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 'i' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | 16 -> ( + match String.unsafe_get s pos with + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'd' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'm' && String.unsafe_get s (pos+10) = 'e' && String.unsafe_get s (pos+11) = 's' && String.unsafe_get s (pos+12) = 't' && String.unsafe_get s (pos+13) = 'a' && String.unsafe_get s (pos+14) = 'm' && String.unsafe_get s (pos+15) = 'p' then ( + 7 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'e' && String.unsafe_get s (pos+9) = 'v' && String.unsafe_get s (pos+10) = 'e' && String.unsafe_get s (pos+11) = 'r' && String.unsafe_get s (pos+12) = 'y' && String.unsafe_get s (pos+13) = 'o' && String.unsafe_get s (pos+14) = 'n' && String.unsafe_get s (pos+15) = 'e' then ( + 9 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_author := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_channel_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_member := ( + Some ( + ( + read_partial_member + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_guild_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 5 -> + field_content := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 6 -> + field_timestamp := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_edited_timestamp := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 8 -> + field_tts := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 9 -> + field_mention_everyone := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 10 -> + field_mentions := ( + ( + read__4 + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_role_mentions := ( + Some ( + ( + read__4 + ) p lb + ) + ); + ) + | 12 -> + field_attachments := ( + ( + read__6 + ) p lb + ); + bits0 := !bits0 lor 0x100; + | 13 -> + field_embeds := ( + ( + read__7 + ) p lb + ); + bits0 := !bits0 lor 0x200; + | 14 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_reactions := ( + Some ( + ( + read__4 + ) p lb + ) + ); + ) + | 15 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nonce := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 16 -> + field_pinned := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x400; + | 17 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_webhook_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 18 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x800; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 's' then ( + 8 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 't' && String.unsafe_get s (pos+1) = 'y' && String.unsafe_get s (pos+2) = 'p' && String.unsafe_get s (pos+3) = 'e' then ( + 18 + ) + else ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'e' then ( + 15 + ) + else ( + -1 + ) + ) + | 6 -> ( + match String.unsafe_get s pos with + | 'a' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'h' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'r' then ( + 1 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = 's' then ( + 13 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'b' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' then ( + 16 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'c' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'n' && String.unsafe_get s (pos+6) = 't' then ( + 5 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 4 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 's' then ( + 10 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 9 -> ( + match String.unsafe_get s pos with + | 'r' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 's' then ( + 14 + ) + else ( + -1 + ) + ) + | 't' -> ( + if String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' && String.unsafe_get s (pos+5) = 't' && String.unsafe_get s (pos+6) = 'a' && String.unsafe_get s (pos+7) = 'm' && String.unsafe_get s (pos+8) = 'p' then ( + 6 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 10 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'h' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'l' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'd' then ( + 2 + ) + else ( + -1 + ) + ) + | 'w' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'b' && String.unsafe_get s (pos+3) = 'h' && String.unsafe_get s (pos+4) = 'o' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'k' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'd' then ( + 17 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 11 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'c' && String.unsafe_get s (pos+5) = 'h' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 't' && String.unsafe_get s (pos+10) = 's' then ( + 12 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = '_' && String.unsafe_get s (pos+5) = 'm' && String.unsafe_get s (pos+6) = 'e' && String.unsafe_get s (pos+7) = 'n' && String.unsafe_get s (pos+8) = 't' && String.unsafe_get s (pos+9) = 'i' && String.unsafe_get s (pos+10) = 'o' && String.unsafe_get s (pos+11) = 'n' && String.unsafe_get s (pos+12) = 's' then ( + 11 + ) + else ( + -1 + ) + ) + | 16 -> ( + match String.unsafe_get s pos with + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'd' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'e' && String.unsafe_get s (pos+5) = 'd' && String.unsafe_get s (pos+6) = '_' && String.unsafe_get s (pos+7) = 't' && String.unsafe_get s (pos+8) = 'i' && String.unsafe_get s (pos+9) = 'm' && String.unsafe_get s (pos+10) = 'e' && String.unsafe_get s (pos+11) = 's' && String.unsafe_get s (pos+12) = 't' && String.unsafe_get s (pos+13) = 'a' && String.unsafe_get s (pos+14) = 'm' && String.unsafe_get s (pos+15) = 'p' then ( + 7 + ) + else ( + -1 + ) + ) + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = '_' && String.unsafe_get s (pos+8) = 'e' && String.unsafe_get s (pos+9) = 'v' && String.unsafe_get s (pos+10) = 'e' && String.unsafe_get s (pos+11) = 'r' && String.unsafe_get s (pos+12) = 'y' && String.unsafe_get s (pos+13) = 'o' && String.unsafe_get s (pos+14) = 'n' && String.unsafe_get s (pos+15) = 'e' then ( + 9 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_author := ( + ( + read_user + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_channel_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_member := ( + Some ( + ( + read_partial_member + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_guild_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 5 -> + field_content := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 6 -> + field_timestamp := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 7 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_edited_timestamp := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 8 -> + field_tts := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 9 -> + field_mention_everyone := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 10 -> + field_mentions := ( + ( + read__4 + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 11 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_role_mentions := ( + Some ( + ( + read__4 + ) p lb + ) + ); + ) + | 12 -> + field_attachments := ( + ( + read__6 + ) p lb + ); + bits0 := !bits0 lor 0x100; + | 13 -> + field_embeds := ( + ( + read__7 + ) p lb + ); + bits0 := !bits0 lor 0x200; + | 14 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_reactions := ( + Some ( + ( + read__4 + ) p lb + ) + ); + ) + | 15 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_nonce := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 16 -> + field_pinned := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x400; + | 17 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_webhook_id := ( + Some ( + ( + read_snowflake + ) p lb + ) + ); + ) + | 18 -> + field_kind := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x800; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0xfff then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "author"; "channel_id"; "content"; "timestamp"; "tts"; "mention_everyone"; "mentions"; "attachments"; "embeds"; "pinned"; "kind" |]; + ( + { + id = !field_id; + author = !field_author; + channel_id = !field_channel_id; + member = !field_member; + guild_id = !field_guild_id; + content = !field_content; + timestamp = !field_timestamp; + edited_timestamp = !field_edited_timestamp; + tts = !field_tts; + mention_everyone = !field_mention_everyone; + mentions = !field_mentions; + role_mentions = !field_role_mentions; + attachments = !field_attachments; + embeds = !field_embeds; + reactions = !field_reactions; + nonce = !field_nonce; + pinned = !field_pinned; + webhook_id = !field_webhook_id; + kind = !field_kind; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_reaction = ( + Reaction_j.write_t +) +let string_of_reaction ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_reaction ob x; + Bi_outbuf.contents ob +let read_reaction = ( + Reaction_j.read_t +) +let reaction_of_string s = + read_reaction (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_member = ( + Member_j.write_t +) +let string_of_member ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_member ob x; + Bi_outbuf.contents ob +let read_member = ( + Member_j.read_t +) +let member_of_string s = + read_member (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/message_j.mli b/lib/models/gen/message_j.mli new file mode 100644 index 0000000..04aa440 --- /dev/null +++ b/lib/models/gen/message_j.mli @@ -0,0 +1,199 @@ +(* Auto-generated from "message.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_member = Member_t.partial_member + +type embed = Embed_t.t + +type attachment = Attachment_t.t + +type t = Message_t.t = { + id: snowflake; + author: user; + channel_id: snowflake; + member: partial_member option; + guild_id: snowflake option; + content: string; + timestamp: string; + edited_timestamp: string option; + tts: bool; + mention_everyone: bool; + mentions: snowflake list; + role_mentions: snowflake list option; + attachments: attachment list; + embeds: embed list; + reactions: snowflake list option; + nonce: snowflake option; + pinned: bool; + webhook_id: snowflake option; + kind: int +} + +type reaction = Reaction_t.t + +type member = Member_t.t + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_partial_member : + Bi_outbuf.t -> partial_member -> unit + (** Output a JSON value of type {!partial_member}. *) + +val string_of_partial_member : + ?len:int -> partial_member -> string + (** Serialize a value of type {!partial_member} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_partial_member : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> partial_member + (** Input JSON data of type {!partial_member}. *) + +val partial_member_of_string : + string -> partial_member + (** Deserialize JSON data of type {!partial_member}. *) + +val write_embed : + Bi_outbuf.t -> embed -> unit + (** Output a JSON value of type {!embed}. *) + +val string_of_embed : + ?len:int -> embed -> string + (** Serialize a value of type {!embed} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_embed : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> embed + (** Input JSON data of type {!embed}. *) + +val embed_of_string : + string -> embed + (** Deserialize JSON data of type {!embed}. *) + +val write_attachment : + Bi_outbuf.t -> attachment -> unit + (** Output a JSON value of type {!attachment}. *) + +val string_of_attachment : + ?len:int -> attachment -> string + (** Serialize a value of type {!attachment} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_attachment : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> attachment + (** Input JSON data of type {!attachment}. *) + +val attachment_of_string : + string -> attachment + (** Deserialize JSON data of type {!attachment}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + +val write_reaction : + Bi_outbuf.t -> reaction -> unit + (** Output a JSON value of type {!reaction}. *) + +val string_of_reaction : + ?len:int -> reaction -> string + (** Serialize a value of type {!reaction} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_reaction : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> reaction + (** Input JSON data of type {!reaction}. *) + +val reaction_of_string : + string -> reaction + (** Deserialize JSON data of type {!reaction}. *) + +val write_member : + Bi_outbuf.t -> member -> unit + (** Output a JSON value of type {!member}. *) + +val string_of_member : + ?len:int -> member -> string + (** Serialize a value of type {!member} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_member : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> member + (** Input JSON data of type {!member}. *) + +val member_of_string : + string -> member + (** Deserialize JSON data of type {!member}. *) + diff --git a/lib/models/gen/message_t.ml b/lib/models/gen/message_t.ml new file mode 100644 index 0000000..ce2d5a4 --- /dev/null +++ b/lib/models/gen/message_t.ml @@ -0,0 +1,38 @@ +(* Auto-generated from "message.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_member = Member_t.partial_member + +type embed = Embed_t.t + +type attachment = Attachment_t.t + +type t = { + id: snowflake; + author: user; + channel_id: snowflake; + member: partial_member option; + guild_id: snowflake option; + content: string; + timestamp: string; + edited_timestamp: string option; + tts: bool; + mention_everyone: bool; + mentions: snowflake list; + role_mentions: snowflake list option; + attachments: attachment list; + embeds: embed list; + reactions: snowflake list option; + nonce: snowflake option; + pinned: bool; + webhook_id: snowflake option; + kind: int +} + +type reaction = Reaction_t.t + +type member = Member_t.t diff --git a/lib/models/gen/message_t.mli b/lib/models/gen/message_t.mli new file mode 100644 index 0000000..ce2d5a4 --- /dev/null +++ b/lib/models/gen/message_t.mli @@ -0,0 +1,38 @@ +(* Auto-generated from "message.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_member = Member_t.partial_member + +type embed = Embed_t.t + +type attachment = Attachment_t.t + +type t = { + id: snowflake; + author: user; + channel_id: snowflake; + member: partial_member option; + guild_id: snowflake option; + content: string; + timestamp: string; + edited_timestamp: string option; + tts: bool; + mention_everyone: bool; + mentions: snowflake list; + role_mentions: snowflake list option; + attachments: attachment list; + embeds: embed list; + reactions: snowflake list option; + nonce: snowflake option; + pinned: bool; + webhook_id: snowflake option; + kind: int +} + +type reaction = Reaction_t.t + +type member = Member_t.t diff --git a/lib/models/gen/presence.atd b/lib/models/gen/presence.atd new file mode 100644 index 0000000..da9b3fd --- /dev/null +++ b/lib/models/gen/presence.atd @@ -0,0 +1,13 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract +type user <ocaml from="User" t="t"> = abstract +type partial_user <ocaml from="User" t="partial_user"> = abstract +type activity <ocaml from="Activity" t="t"> = abstract + +type t = { + user: partial_user; + roles: snowflake list; + ?game: activity option; + guild_id: snowflake; + status: string; + activities: activity list; +}
\ No newline at end of file diff --git a/lib/models/gen/presence_j.ml b/lib/models/gen/presence_j.ml new file mode 100644 index 0000000..b4ea497 --- /dev/null +++ b/lib/models/gen/presence_j.ml @@ -0,0 +1,492 @@ +(* Auto-generated from "presence.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_user = User_t.partial_user + +type activity = Activity_t.t + +type t = Presence_t.t = { + user: partial_user; + roles: snowflake list; + game: activity option; + guild_id: snowflake; + status: string; + activities: activity list +} + +let write_user = ( + User_j.write_t +) +let string_of_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_user ob x; + Bi_outbuf.contents ob +let read_user = ( + User_j.read_t +) +let user_of_string s = + read_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_partial_user = ( + User_j.write_partial_user +) +let string_of_partial_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_partial_user ob x; + Bi_outbuf.contents ob +let read_partial_user = ( + User_j.read_partial_user +) +let partial_user_of_string s = + read_partial_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_activity = ( + Activity_j.write_t +) +let string_of_activity ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_activity ob x; + Bi_outbuf.contents ob +let read_activity = ( + Activity_j.read_t +) +let activity_of_string s = + read_activity (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__3 = ( + Atdgen_runtime.Oj_run.write_list ( + write_activity + ) +) +let string_of__3 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__3 ob x; + Bi_outbuf.contents ob +let read__3 = ( + Atdgen_runtime.Oj_run.read_list ( + read_activity + ) +) +let _3_of_string s = + read__3 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__2 = ( + Atdgen_runtime.Oj_run.write_option ( + write_activity + ) +) +let string_of__2 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__2 ob x; + Bi_outbuf.contents ob +let read__2 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + read_activity + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + read_activity + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _2_of_string s = + read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_list ( + write_snowflake + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + Atdgen_runtime.Oj_run.read_list ( + read_snowflake + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"user\":"; + ( + write_partial_user + ) + ob x.user; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"roles\":"; + ( + write__1 + ) + ob x.roles; + (match x.game with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"game\":"; + ( + write_activity + ) + ob x; + ); + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"guild_id\":"; + ( + write_snowflake + ) + ob x.guild_id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"status\":"; + ( + Yojson.Safe.write_string + ) + ob x.status; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"activities\":"; + ( + write__3 + ) + ob x.activities; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_user = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_roles = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_game = ref (None) in + let field_guild_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_status = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_activities = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 's' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 's' then ( + 4 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'g' && String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 3 + ) + else ( + -1 + ) + ) + | 10 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'v' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 't' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'e' && String.unsafe_get s (pos+9) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_user := ( + ( + read_partial_user + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_roles := ( + ( + read__1 + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_game := ( + Some ( + ( + read_activity + ) p lb + ) + ); + ) + | 3 -> + field_guild_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_status := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 5 -> + field_activities := ( + ( + read__3 + ) p lb + ); + bits0 := !bits0 lor 0x10; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 4 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 2 + ) + else ( + -1 + ) + ) + | 'u' -> ( + if String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 5 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' && String.unsafe_get s (pos+4) = 's' then ( + 1 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 's' && String.unsafe_get s (pos+1) = 't' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'u' && String.unsafe_get s (pos+5) = 's' then ( + 4 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'g' && String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 3 + ) + else ( + -1 + ) + ) + | 10 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'c' && String.unsafe_get s (pos+2) = 't' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 'v' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 't' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'e' && String.unsafe_get s (pos+9) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_user := ( + ( + read_partial_user + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_roles := ( + ( + read__1 + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_game := ( + Some ( + ( + read_activity + ) p lb + ) + ); + ) + | 3 -> + field_guild_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 4 -> + field_status := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 5 -> + field_activities := ( + ( + read__3 + ) p lb + ); + bits0 := !bits0 lor 0x10; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1f then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "user"; "roles"; "guild_id"; "status"; "activities" |]; + ( + { + user = !field_user; + roles = !field_roles; + game = !field_game; + guild_id = !field_guild_id; + status = !field_status; + activities = !field_activities; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/presence_j.mli b/lib/models/gen/presence_j.mli new file mode 100644 index 0000000..be68b3f --- /dev/null +++ b/lib/models/gen/presence_j.mli @@ -0,0 +1,120 @@ +(* Auto-generated from "presence.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_user = User_t.partial_user + +type activity = Activity_t.t + +type t = Presence_t.t = { + user: partial_user; + roles: snowflake list; + game: activity option; + guild_id: snowflake; + status: string; + activities: activity list +} + +val write_user : + Bi_outbuf.t -> user -> unit + (** Output a JSON value of type {!user}. *) + +val string_of_user : + ?len:int -> user -> string + (** Serialize a value of type {!user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> user + (** Input JSON data of type {!user}. *) + +val user_of_string : + string -> user + (** Deserialize JSON data of type {!user}. *) + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_partial_user : + Bi_outbuf.t -> partial_user -> unit + (** Output a JSON value of type {!partial_user}. *) + +val string_of_partial_user : + ?len:int -> partial_user -> string + (** Serialize a value of type {!partial_user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_partial_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> partial_user + (** Input JSON data of type {!partial_user}. *) + +val partial_user_of_string : + string -> partial_user + (** Deserialize JSON data of type {!partial_user}. *) + +val write_activity : + Bi_outbuf.t -> activity -> unit + (** Output a JSON value of type {!activity}. *) + +val string_of_activity : + ?len:int -> activity -> string + (** Serialize a value of type {!activity} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_activity : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> activity + (** Input JSON data of type {!activity}. *) + +val activity_of_string : + string -> activity + (** Deserialize JSON data of type {!activity}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/presence_t.ml b/lib/models/gen/presence_t.ml new file mode 100644 index 0000000..940d986 --- /dev/null +++ b/lib/models/gen/presence_t.ml @@ -0,0 +1,19 @@ +(* Auto-generated from "presence.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_user = User_t.partial_user + +type activity = Activity_t.t + +type t = { + user: partial_user; + roles: snowflake list; + game: activity option; + guild_id: snowflake; + status: string; + activities: activity list +} diff --git a/lib/models/gen/presence_t.mli b/lib/models/gen/presence_t.mli new file mode 100644 index 0000000..940d986 --- /dev/null +++ b/lib/models/gen/presence_t.mli @@ -0,0 +1,19 @@ +(* Auto-generated from "presence.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type user = User_t.t + +type snowflake = Snowflake_t.t + +type partial_user = User_t.partial_user + +type activity = Activity_t.t + +type t = { + user: partial_user; + roles: snowflake list; + game: activity option; + guild_id: snowflake; + status: string; + activities: activity list +} diff --git a/lib/models/gen/reaction.atd b/lib/models/gen/reaction.atd new file mode 100644 index 0000000..aa41483 --- /dev/null +++ b/lib/models/gen/reaction.atd @@ -0,0 +1,6 @@ +type emoji <ocaml from="Emoji" t="t"> = abstract + +type t = { + count: int; + emoji: emoji; +}
\ No newline at end of file diff --git a/lib/models/gen/reaction_j.ml b/lib/models/gen/reaction_j.ml new file mode 100644 index 0000000..fe91833 --- /dev/null +++ b/lib/models/gen/reaction_j.ml @@ -0,0 +1,180 @@ +(* Auto-generated from "reaction.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type emoji = Emoji_t.t + +type t = Reaction_t.t = { count: int; emoji: emoji } + +let write_emoji = ( + Emoji_j.write_t +) +let string_of_emoji ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_emoji ob x; + Bi_outbuf.contents ob +let read_emoji = ( + Emoji_j.read_t +) +let emoji_of_string s = + read_emoji (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"count\":"; + ( + Yojson.Safe.write_int + ) + ob x.count; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"emoji\":"; + ( + write_emoji + ) + ob x.emoji; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_count = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_emoji = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + if len = 5 then ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'u' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 't' then ( + 0 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'j' && String.unsafe_get s (pos+4) = 'i' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_count := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_emoji := ( + ( + read_emoji + ) p lb + ); + bits0 := !bits0 lor 0x2; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + if len = 5 then ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'u' && String.unsafe_get s (pos+3) = 'n' && String.unsafe_get s (pos+4) = 't' then ( + 0 + ) + else ( + -1 + ) + ) + | 'e' -> ( + if String.unsafe_get s (pos+1) = 'm' && String.unsafe_get s (pos+2) = 'o' && String.unsafe_get s (pos+3) = 'j' && String.unsafe_get s (pos+4) = 'i' then ( + 1 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + else ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_count := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_emoji := ( + ( + read_emoji + ) p lb + ); + bits0 := !bits0 lor 0x2; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x3 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "count"; "emoji" |]; + ( + { + count = !field_count; + emoji = !field_emoji; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/reaction_j.mli b/lib/models/gen/reaction_j.mli new file mode 100644 index 0000000..0d6a598 --- /dev/null +++ b/lib/models/gen/reaction_j.mli @@ -0,0 +1,47 @@ +(* Auto-generated from "reaction.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type emoji = Emoji_t.t + +type t = Reaction_t.t = { count: int; emoji: emoji } + +val write_emoji : + Bi_outbuf.t -> emoji -> unit + (** Output a JSON value of type {!emoji}. *) + +val string_of_emoji : + ?len:int -> emoji -> string + (** Serialize a value of type {!emoji} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_emoji : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> emoji + (** Input JSON data of type {!emoji}. *) + +val emoji_of_string : + string -> emoji + (** Deserialize JSON data of type {!emoji}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/reaction_t.ml b/lib/models/gen/reaction_t.ml new file mode 100644 index 0000000..666030b --- /dev/null +++ b/lib/models/gen/reaction_t.ml @@ -0,0 +1,6 @@ +(* Auto-generated from "reaction.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type emoji = Emoji_t.t + +type t = { count: int; emoji: emoji } diff --git a/lib/models/gen/reaction_t.mli b/lib/models/gen/reaction_t.mli new file mode 100644 index 0000000..666030b --- /dev/null +++ b/lib/models/gen/reaction_t.mli @@ -0,0 +1,6 @@ +(* Auto-generated from "reaction.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type emoji = Emoji_t.t + +type t = { count: int; emoji: emoji } diff --git a/lib/models/gen/role.atd b/lib/models/gen/role.atd new file mode 100644 index 0000000..a6bdcba --- /dev/null +++ b/lib/models/gen/role.atd @@ -0,0 +1,12 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract + +type t = { + id: snowflake; + name: string; + colour <json name="color">: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; + mentionable: bool; +}
\ No newline at end of file diff --git a/lib/models/gen/role_j.ml b/lib/models/gen/role_j.ml new file mode 100644 index 0000000..a15b6cf --- /dev/null +++ b/lib/models/gen/role_j.ml @@ -0,0 +1,449 @@ +(* Auto-generated from "role.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = Role_t.t = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; + mentionable: bool +} + +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"color\":"; + ( + Yojson.Safe.write_int + ) + ob x.colour; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"hoist\":"; + ( + Yojson.Safe.write_bool + ) + ob x.hoist; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"position\":"; + ( + Yojson.Safe.write_int + ) + ob x.position; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"permissions\":"; + ( + Yojson.Safe.write_int + ) + ob x.permissions; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"managed\":"; + ( + Yojson.Safe.write_bool + ) + ob x.managed; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mentionable\":"; + ( + Yojson.Safe.write_bool + ) + ob x.mentionable; + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_colour = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_hoist = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_position = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_permissions = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_managed = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mentionable = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | 'h' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 't' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 4 + ) + else ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' && String.unsafe_get s (pos+6) = 's' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_colour := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_hoist := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_position := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + field_permissions := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 6 -> + field_managed := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 7 -> + field_mentionable := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x80; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | 'h' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 't' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'p' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 4 + ) + else ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' && String.unsafe_get s (pos+6) = 's' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_colour := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_hoist := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_position := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + field_permissions := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 6 -> + field_managed := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 7 -> + field_mentionable := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x80; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0xff then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "name"; "colour"; "hoist"; "position"; "permissions"; "managed"; "mentionable" |]; + ( + { + id = !field_id; + name = !field_name; + colour = !field_colour; + hoist = !field_hoist; + position = !field_position; + permissions = !field_permissions; + managed = !field_managed; + mentionable = !field_mentionable; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/role_j.mli b/lib/models/gen/role_j.mli new file mode 100644 index 0000000..b4ea78c --- /dev/null +++ b/lib/models/gen/role_j.mli @@ -0,0 +1,56 @@ +(* Auto-generated from "role.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = Role_t.t = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; + mentionable: bool +} + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/role_t.ml b/lib/models/gen/role_t.ml new file mode 100644 index 0000000..a4e83c5 --- /dev/null +++ b/lib/models/gen/role_t.ml @@ -0,0 +1,15 @@ +(* Auto-generated from "role.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; + mentionable: bool +} diff --git a/lib/models/gen/role_t.mli b/lib/models/gen/role_t.mli new file mode 100644 index 0000000..a4e83c5 --- /dev/null +++ b/lib/models/gen/role_t.mli @@ -0,0 +1,15 @@ +(* Auto-generated from "role.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; + mentionable: bool +} diff --git a/lib/models/gen/snowflake.atd b/lib/models/gen/snowflake.atd new file mode 100644 index 0000000..98dc032 --- /dev/null +++ b/lib/models/gen/snowflake.atd @@ -0,0 +1 @@ +type t = int
\ No newline at end of file diff --git a/lib/models/gen/snowflake_j.ml b/lib/models/gen/snowflake_j.ml new file mode 100644 index 0000000..80f6f63 --- /dev/null +++ b/lib/models/gen/snowflake_j.ml @@ -0,0 +1,17 @@ +(* Auto-generated from "snowflake.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type t = Snowflake_t.t + +let write_t = ( + Yojson.Safe.write_int +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + Atdgen_runtime.Oj_run.read_int +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/snowflake_j.mli b/lib/models/gen/snowflake_j.mli new file mode 100644 index 0000000..fed97a4 --- /dev/null +++ b/lib/models/gen/snowflake_j.mli @@ -0,0 +1,25 @@ +(* Auto-generated from "snowflake.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type t = Snowflake_t.t + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + diff --git a/lib/models/gen/snowflake_t.ml b/lib/models/gen/snowflake_t.ml new file mode 100644 index 0000000..a7bdb08 --- /dev/null +++ b/lib/models/gen/snowflake_t.ml @@ -0,0 +1,4 @@ +(* Auto-generated from "snowflake.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type t = int diff --git a/lib/models/gen/snowflake_t.mli b/lib/models/gen/snowflake_t.mli new file mode 100644 index 0000000..a7bdb08 --- /dev/null +++ b/lib/models/gen/snowflake_t.mli @@ -0,0 +1,4 @@ +(* Auto-generated from "snowflake.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type t = int diff --git a/lib/models/gen/user.atd b/lib/models/gen/user.atd new file mode 100644 index 0000000..106b3b0 --- /dev/null +++ b/lib/models/gen/user.atd @@ -0,0 +1,13 @@ +type snowflake <ocaml from="Snowflake" t="t"> = abstract + +type t = { + id: snowflake; + username: string; + discriminator: string; + ?avatar: string option; + ~bot <ocaml default="false">: bool; +} + +type partial_user = { + id: snowflake; +}
\ No newline at end of file diff --git a/lib/models/gen/user_j.ml b/lib/models/gen/user_j.ml new file mode 100644 index 0000000..552a20d --- /dev/null +++ b/lib/models/gen/user_j.ml @@ -0,0 +1,468 @@ +(* Auto-generated from "user.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = User_t.t = { + id: snowflake; + username: string; + discriminator: string; + avatar: string option; + bot: bool +} + +type partial_user = User_t.partial_user = { id: snowflake } + +let write_snowflake = ( + Snowflake_j.write_t +) +let string_of_snowflake ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_snowflake ob x; + Bi_outbuf.contents ob +let read_snowflake = ( + Snowflake_j.read_t +) +let snowflake_of_string s = + read_snowflake (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write__1 = ( + Atdgen_runtime.Oj_run.write_option ( + Yojson.Safe.write_string + ) +) +let string_of__1 ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write__1 ob x; + Bi_outbuf.contents ob +let read__1 = ( + fun p lb -> + Yojson.Safe.read_space p lb; + match Yojson.Safe.start_any_variant p lb with + | `Edgy_bracket -> ( + match Yojson.Safe.read_ident p lb with + | "None" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (None : _ option) + | "Some" -> + Atdgen_runtime.Oj_run.read_until_field_value p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_gt p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Double_quote -> ( + match Yojson.Safe.finish_string p lb with + | "None" -> + (None : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) + | `Square_bracket -> ( + match Atdgen_runtime.Oj_run.read_string p lb with + | "Some" -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_comma p lb; + Yojson.Safe.read_space p lb; + let x = ( + Atdgen_runtime.Oj_run.read_string + ) p lb + in + Yojson.Safe.read_space p lb; + Yojson.Safe.read_rbr p lb; + (Some x : _ option) + | x -> + Atdgen_runtime.Oj_run.invalid_variant_tag p x + ) +) +let _1_of_string s = + read__1 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_t : _ -> t -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"username\":"; + ( + Yojson.Safe.write_string + ) + ob x.username; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"discriminator\":"; + ( + Yojson.Safe.write_string + ) + ob x.discriminator; + (match x.avatar with None -> () | Some x -> + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"avatar\":"; + ( + Yojson.Safe.write_string + ) + ob x; + ); + if x.bot <> false then ( + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"bot\":"; + ( + Yojson.Safe.write_bool + ) + ob x.bot; + ); + Bi_outbuf.add_char ob '}'; +) +let string_of_t ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_t ob x; + Bi_outbuf.contents ob +let read_t = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_username = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_discriminator = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_avatar = ref (None) in + let field_bot = ref (false) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 'b' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 't' then ( + 4 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'v' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'a' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 't' && String.unsafe_get s (pos+11) = 'o' && String.unsafe_get s (pos+12) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_username := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_discriminator := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_avatar := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_bot := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 3 -> ( + if String.unsafe_get s pos = 'b' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 't' then ( + 4 + ) + else ( + -1 + ) + ) + | 6 -> ( + if String.unsafe_get s pos = 'a' && String.unsafe_get s (pos+1) = 'v' && String.unsafe_get s (pos+2) = 'a' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'a' && String.unsafe_get s (pos+5) = 'r' then ( + 3 + ) + else ( + -1 + ) + ) + | 8 -> ( + if String.unsafe_get s pos = 'u' && String.unsafe_get s (pos+1) = 's' && String.unsafe_get s (pos+2) = 'e' && String.unsafe_get s (pos+3) = 'r' && String.unsafe_get s (pos+4) = 'n' && String.unsafe_get s (pos+5) = 'a' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 13 -> ( + if String.unsafe_get s pos = 'd' && String.unsafe_get s (pos+1) = 'i' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'c' && String.unsafe_get s (pos+4) = 'r' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'm' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'n' && String.unsafe_get s (pos+9) = 'a' && String.unsafe_get s (pos+10) = 't' && String.unsafe_get s (pos+11) = 'o' && String.unsafe_get s (pos+12) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_username := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_discriminator := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_avatar := ( + Some ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ) + ); + ) + | 4 -> + if not (Yojson.Safe.read_null_if_possible p lb) then ( + field_bot := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + ) + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x7 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "username"; "discriminator" |]; + ( + { + id = !field_id; + username = !field_username; + discriminator = !field_discriminator; + avatar = !field_avatar; + bot = !field_bot; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_partial_user : _ -> partial_user -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + Bi_outbuf.add_char ob '}'; +) +let string_of_partial_user ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_partial_user ob x; + Bi_outbuf.contents ob +let read_partial_user = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + if len = 2 && String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + if len = 2 && String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id" |]; + ( + { + id = !field_id; + } + : partial_user) + ) +) +let partial_user_of_string s = + read_partial_user (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/user_j.mli b/lib/models/gen/user_j.mli new file mode 100644 index 0000000..576768e --- /dev/null +++ b/lib/models/gen/user_j.mli @@ -0,0 +1,75 @@ +(* Auto-generated from "user.atd" *) +[@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = User_t.t = { + id: snowflake; + username: string; + discriminator: string; + avatar: string option; + bot: bool +} + +type partial_user = User_t.partial_user = { id: snowflake } + +val write_snowflake : + Bi_outbuf.t -> snowflake -> unit + (** Output a JSON value of type {!snowflake}. *) + +val string_of_snowflake : + ?len:int -> snowflake -> string + (** Serialize a value of type {!snowflake} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_snowflake : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> snowflake + (** Input JSON data of type {!snowflake}. *) + +val snowflake_of_string : + string -> snowflake + (** Deserialize JSON data of type {!snowflake}. *) + +val write_t : + Bi_outbuf.t -> t -> unit + (** Output a JSON value of type {!t}. *) + +val string_of_t : + ?len:int -> t -> string + (** Serialize a value of type {!t} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_t : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> t + (** Input JSON data of type {!t}. *) + +val t_of_string : + string -> t + (** Deserialize JSON data of type {!t}. *) + +val write_partial_user : + Bi_outbuf.t -> partial_user -> unit + (** Output a JSON value of type {!partial_user}. *) + +val string_of_partial_user : + ?len:int -> partial_user -> string + (** Serialize a value of type {!partial_user} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_partial_user : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> partial_user + (** Input JSON data of type {!partial_user}. *) + +val partial_user_of_string : + string -> partial_user + (** Deserialize JSON data of type {!partial_user}. *) + diff --git a/lib/models/gen/user_t.ml b/lib/models/gen/user_t.ml new file mode 100644 index 0000000..294cf0a --- /dev/null +++ b/lib/models/gen/user_t.ml @@ -0,0 +1,14 @@ +(* Auto-generated from "user.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + username: string; + discriminator: string; + avatar: string option; + bot: bool +} + +type partial_user = { id: snowflake } diff --git a/lib/models/gen/user_t.mli b/lib/models/gen/user_t.mli new file mode 100644 index 0000000..294cf0a --- /dev/null +++ b/lib/models/gen/user_t.mli @@ -0,0 +1,14 @@ +(* Auto-generated from "user.atd" *) + [@@@ocaml.warning "-27-32-35-39"] + +type snowflake = Snowflake_t.t + +type t = { + id: snowflake; + username: string; + discriminator: string; + avatar: string option; + bot: bool +} + +type partial_user = { id: snowflake } diff --git a/lib/models/guild.ml b/lib/models/guild.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/guild.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/member.ml b/lib/models/member.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/member.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/message.ml b/lib/models/message.ml new file mode 100644 index 0000000..29148ee --- /dev/null +++ b/lib/models/message.ml @@ -0,0 +1,43 @@ +module Make(Http : S.Http) = struct + open Message_t + + let add_reaction msg (emoji:Emoji_t.t) = + let e = match emoji.id with + | Some i -> Printf.sprintf "%s:%d" emoji.name i + | None -> emoji.name + in + Http.create_reaction msg.channel_id msg.id e + + let remove_reaction msg (emoji:Emoji_t.t) (user:User_t.t) = + let e = match emoji.id with + | Some i -> Printf.sprintf "%s:%d" emoji.name i + | None -> emoji.name + in + Http.delete_reaction msg.channel_id msg.id e user.id + + let clear_reactions msg = + Http.delete_reactions msg.channel_id msg.id + + let delete msg = + Http.delete_message msg.channel_id msg.id + + let pin msg = + Http.pin_message msg.channel_id msg.id + + let unpin msg = + Http.unpin_message msg.channel_id msg.id + + let reply msg cont = + let rep = `Assoc [("content", `String cont)] in + Http.create_message msg.channel_id rep + + let set_content msg cont = + Message_j.string_of_t { msg with content = cont; } + |> Yojson.Safe.from_string + |> Http.edit_message msg.channel_id msg.id + + let set_embed msg embed = + Message_j.string_of_t { msg with embeds = [embed]; } + |> Yojson.Safe.from_string + |> Http.edit_message msg.channel_id msg.id +end
\ No newline at end of file diff --git a/lib/models/message.mli b/lib/models/message.mli new file mode 100644 index 0000000..6f6242f --- /dev/null +++ b/lib/models/message.mli @@ -0,0 +1 @@ +module Make(Http : S.Http) : S.Message
\ No newline at end of file diff --git a/lib/models/presence.ml b/lib/models/presence.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/presence.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/reaction.ml b/lib/models/reaction.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/reaction.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/role.ml b/lib/models/role.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/role.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/snowflake.ml b/lib/models/snowflake.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/snowflake.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/models/user.ml b/lib/models/user.ml new file mode 100644 index 0000000..36b7d4b --- /dev/null +++ b/lib/models/user.ml @@ -0,0 +1,2 @@ +module Make(Http : S.Http) = struct +end
\ No newline at end of file diff --git a/lib/client/opcode.ml b/lib/opcode.ml index 2462d05..2462d05 100644 --- a/lib/client/opcode.ml +++ b/lib/opcode.ml diff --git a/lib/rl.ml b/lib/rl.ml new file mode 100644 index 0000000..f0c15be --- /dev/null +++ b/lib/rl.ml @@ -0,0 +1,30 @@ +open Core +open Async + +module RouteMap = Map.Make(String) + +type rl = { + limit: int; + remaining: int; + reset: int; +} + +type t = ((rl, read_write) Mvar.t) RouteMap.t + +let rl_of_header h = + let module C = Cohttp.Header in + match C.get h "X-RateLimit-Limit", C.get h "X-RateLimit-Remaining", C.get h "X-RateLimit-Reset" with + | Some lim, Some rem, Some re -> + let limit = Int.of_string lim in + let remaining = Int.of_string rem in + let reset = Int.of_string re in + Some { limit; remaining; reset; } + | _ -> None + +let default = { limit = 1; remaining = 1; reset = 0; } +let empty : t = RouteMap.empty +let update = RouteMap.update +let find = RouteMap.find +let find_exn m s = match find m s with + | Some r -> r + | None -> raise (Not_found_s (String.sexp_of_t s))
\ No newline at end of file diff --git a/lib/s.ml b/lib/s.ml new file mode 100644 index 0000000..afe4209 --- /dev/null +++ b/lib/s.ml @@ -0,0 +1,309 @@ +open Async + +module type Token = sig + val token : string +end + +module type Activity = sig end + +module type Attachment = sig end + +module type Ban = sig end + +module type Channel = sig end + +module type Embed = sig end + +module type Emoji = sig end + +module type Guild = sig end + +module type Member = sig + (* val add_role : Member_t.t -> Role_t.t -> Yojson.Safe.json Deferred.t + val remove_role : Member_t.t -> Role_t.t -> Yojson.Safe.json Deferred.t + val ban : ?reason:string -> ?days:int -> Member_t.t -> Yojson.Safe.json Deferred.t + val ban : ?reason:string -> Member_t.t -> Yojson.Safe.json Deferred.t + val kick : ?reason:string -> Member_t.t -> Yojson.Safe.json Deferred.t + val mute : Member_t.t -> Yojson.Safe.json Deferred.t + val deafen : Member_t.t -> Yojson.Safe.json Deferred.t + val unmute : Member_t.t -> Yojson.Safe.json Deferred.t + val undeafen : Member_t.t -> Yojson.Safe.json Deferred.t *) +end + +module type Message = sig + val add_reaction : Message_t.t -> Emoji_t.t -> Yojson.Safe.json Deferred.t + val remove_reaction : Message_t.t -> Emoji_t.t -> User_t.t -> Yojson.Safe.json Deferred.t + val clear_reactions : Message_t.t -> Yojson.Safe.json Deferred.t + val delete : Message_t.t -> Yojson.Safe.json Deferred.t + val pin : Message_t.t -> Yojson.Safe.json Deferred.t + val unpin : Message_t.t -> Yojson.Safe.json Deferred.t + val reply : Message_t.t -> string -> Yojson.Safe.json Deferred.t + val set_content : Message_t.t -> string -> Yojson.Safe.json Deferred.t + val set_embed : Message_t.t -> Embed_t.t -> Yojson.Safe.json Deferred.t +end + +module type Presence = sig end + +module type Reaction = sig end + +module type Role = sig end + +module type Snowflake = sig end + +module type User = sig end + +module type Http = sig + val token : string + + module Base : sig + exception Invalid_Method + + val base_url : string + + val process_url : string -> Uri.t + val process_request_body : Yojson.Safe.json -> Cohttp_async.Body.t + val process_request_headers : unit -> Cohttp.Header.t + + val process_response : + string -> + Cohttp_async.Response.t * Cohttp_async.Body.t -> + Yojson.Safe.json Deferred.t + + val request : + ?body:Yojson.Safe.json -> + [> `DELETE | `GET | `PATCH | `POST | `PUT ] -> + string -> + Yojson.Safe.json Deferred.t + end + + (* Auto-generated signatures *) + val get_gateway : unit -> Yojson.Safe.json Conduit_async.io + val get_gateway_bot : unit -> Yojson.Safe.json Conduit_async.io + val get_channel : int -> Yojson.Safe.json Conduit_async.io + val modify_channel : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_channel : int -> Yojson.Safe.json Conduit_async.io + val get_messages : int -> Yojson.Safe.json Conduit_async.io + val get_message : int -> int -> Yojson.Safe.json Conduit_async.io + val create_message : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val create_reaction : + int -> int -> string -> Yojson.Safe.json Conduit_async.io + val delete_own_reaction : + int -> int -> string -> Yojson.Safe.json Conduit_async.io + val delete_reaction : + int -> int -> string -> int -> Yojson.Safe.json Conduit_async.io + val get_reactions : + int -> int -> string -> Yojson.Safe.json Conduit_async.io + val delete_reactions : int -> int -> Yojson.Safe.json Conduit_async.io + val edit_message : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_message : int -> int -> Yojson.Safe.json Conduit_async.io + val bulk_delete : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val edit_channel_permissions : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_channel_invites : int -> Yojson.Safe.json Conduit_async.io + val create_channel_invite : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_channel_permission : + int -> int -> Yojson.Safe.json Conduit_async.io + val broadcast_typing : int -> Yojson.Safe.json Conduit_async.io + val get_pinned_messages : int -> Yojson.Safe.json Conduit_async.io + val pin_message : int -> int -> Yojson.Safe.json Conduit_async.io + val unpin_message : int -> int -> Yojson.Safe.json Conduit_async.io + val group_recipient_add : int -> int -> Yojson.Safe.json Conduit_async.io + val group_recipient_remove : + int -> int -> Yojson.Safe.json Conduit_async.io + val get_emojis : int -> Yojson.Safe.json Conduit_async.io + val get_emoji : int -> int -> Yojson.Safe.json Conduit_async.io + val create_emoji : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val edit_emoji : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_emoji : int -> int -> Yojson.Safe.json Conduit_async.io + val create_guild : Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_guild : int -> Yojson.Safe.json Conduit_async.io + val edit_guild : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_guild : int -> Yojson.Safe.json Conduit_async.io + val get_guild_channels : int -> Yojson.Safe.json Conduit_async.io + val create_guild_channel : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val modify_guild_channel_positions : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_member : int -> int -> Yojson.Safe.json Conduit_async.io + val get_members : int -> Yojson.Safe.json Conduit_async.io + val add_member : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val edit_member : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val remove_member : int -> int -> Yojson.Safe.json Conduit_async.io + val change_nickname : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val add_member_role : + int -> int -> int -> Yojson.Safe.json Conduit_async.io + val remove_member_role : + int -> int -> int -> Yojson.Safe.json Conduit_async.io + val get_bans : int -> Yojson.Safe.json Conduit_async.io + val get_ban : int -> int -> Yojson.Safe.json Conduit_async.io + val guild_ban_add : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val guild_ban_remove : int -> int -> Yojson.Safe.json Conduit_async.io + val get_roles : int -> Yojson.Safe.json Conduit_async.io + val guild_role_add : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val guild_roles_edit : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val guild_role_edit : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val guild_role_remove : int -> int -> Yojson.Safe.json Conduit_async.io + val guild_prune_count : int -> Yojson.Safe.json Conduit_async.io + val guild_prune_start : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_guild_voice_regions : int -> Yojson.Safe.json Conduit_async.io + val get_guild_invites : int -> Yojson.Safe.json Conduit_async.io + val get_integrations : int -> Yojson.Safe.json Conduit_async.io + val add_integration : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val edit_integration : + int -> int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_integration : int -> int -> Yojson.Safe.json Conduit_async.io + val sync_integration : int -> int -> Yojson.Safe.json Conduit_async.io + val get_guild_embed : int -> Yojson.Safe.json Conduit_async.io + val edit_guild_embed : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_vanity_url : int -> Yojson.Safe.json Conduit_async.io + val get_invite : string -> Yojson.Safe.json Conduit_async.io + val delete_invite : string -> Yojson.Safe.json Conduit_async.io + val get_current_user : unit -> Yojson.Safe.json Conduit_async.io + val edit_current_user : + Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_guilds : unit -> Yojson.Safe.json Conduit_async.io + val leave_guild : int -> Yojson.Safe.json Conduit_async.io + val get_private_channels : unit -> Yojson.Safe.json Conduit_async.io + val create_dm : Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val create_group_dm : + Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_connections : unit -> Yojson.Safe.json Conduit_async.io + val get_user : int -> Yojson.Safe.json Conduit_async.io + val get_voice_regions : unit -> Yojson.Safe.json Conduit_async.io + val create_webhook : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_channel_webhooks : int -> Yojson.Safe.json Conduit_async.io + val get_guild_webhooks : int -> Yojson.Safe.json Conduit_async.io + val get_webhook : int -> Yojson.Safe.json Conduit_async.io + val get_webhook_with_token : + int -> string -> Yojson.Safe.json Conduit_async.io + val edit_webhook : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val edit_webhook_with_token : + int -> string -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val delete_webhook : int -> Yojson.Safe.json Conduit_async.io + val delete_webhook_with_token : + int -> string -> Yojson.Safe.json Conduit_async.io + val execute_webhook : + int -> string -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val execute_slack_webhook : + int -> string -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val execute_git_webhook : + int -> string -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io + val get_audit_logs : + int -> Yojson.Safe.json -> Yojson.Safe.json Conduit_async.io +end + +module type Models = sig + module Http : Http + module Activity : Activity + module Attachment : Attachment + module Ban : Ban + module Channel : Channel + module Embed : Embed + module Emoji : Emoji + module Guild : Guild + module Member : Member + module Message : Message + module Presence : Presence + module Reaction : Reaction + module Role : Role + module Snowflake : Snowflake + module User : User +end + +module type Handler = sig + val handle_event : + Event.t -> + unit +end + +module type Handler_f = sig + module Make(Models : Models) : Handler +end + +module type Dispatch = sig + val dispatch : ev:string -> string -> unit +end + +module type Sharder = sig + exception Invalid_Payload + exception Failure_to_Establish_Heartbeat + + type t + + val start : + ?count:int -> + unit -> + t Deferred.t + + module Shard : sig + type shard + type 'a t = { + mutable state: 'a; + mutable binds: ('a -> unit) list; + } + + val bind : + f:('a -> unit) -> + 'a t -> + unit + + val heartbeat : + shard -> + shard Deferred.t + + val set_status : + status:Yojson.Safe.json -> + shard -> + shard Deferred.t + + val request_guild_members : + ?query:string -> + ?limit:int -> + guild:Snowflake_t.t -> + shard -> + shard Deferred.t + + val create : + url:string -> + shards:int * int -> + unit -> + shard Deferred.t + end + + val set_status : + status:Yojson.Safe.json -> + t -> + Shard.shard list Deferred.t + + val set_status_with : + f:(Shard.shard -> Yojson.Safe.json) -> + t -> + Shard.shard list Deferred.t + + val request_guild_members : + ?query:string -> + ?limit:int -> + guild:Snowflake_t.t -> + t -> + Shard.shard list Deferred.t +end
\ No newline at end of file diff --git a/lib/sharder.ml b/lib/sharder.ml new file mode 100644 index 0000000..98df132 --- /dev/null +++ b/lib/sharder.ml @@ -0,0 +1,342 @@ +module Make(H : S.Http)(D : S.Dispatch) : S.Sharder = struct + open Async + open Core + open Websocket_async + + exception Invalid_Payload + exception Failure_to_Establish_Heartbeat + + let token = H.token + + module Shard = struct + type shard = { + hb: unit Ivar.t option; + seq: int; + session: string option; + pipe: Frame.t Pipe.Reader.t * Frame.t Pipe.Writer.t; + ready: unit Ivar.t; + url: string; + id: int * int; + } + + type 'a t = { + mutable state: 'a; + mutable binds: ('a -> unit) list; + } + + let identify_lock = Mutex.create () + + let bind ~f t = + t.binds <- f :: t.binds + + let parse (frame:[`Ok of Frame.t | `Eof]) = + match frame with + | `Ok s -> begin + let open Frame.Opcode in + match s.opcode with + | Text -> Some (Yojson.Safe.from_string s.content) + | _ -> None + end + | `Eof -> None + + let push_frame ?payload ~ev shard = + print_endline @@ "Pushing frame. OP: " ^ Opcode.to_string @@ ev; + let content = match payload with + | None -> "" + | Some p -> + Yojson.Safe.to_string @@ `Assoc [ + ("op", `Int (Opcode.to_int ev)); + ("d", p); + ] + in + let (_, write) = shard.pipe in + Pipe.write write @@ Frame.create ~content () + >>| fun () -> + shard + + let heartbeat shard = + let payload = match shard.seq with + | 0 -> `Null + | i -> `Int i + in + push_frame ~payload ~ev:HEARTBEAT shard + + let dispatch ~payload shard = + let module J = Yojson.Safe.Util in + let seq = J.(member "s" payload |> to_int) in + let t = J.(member "t" payload |> to_string) in + let data = J.member "d" payload in + let session = J.(member "session_id" data |> to_string_option) in + if t = "READY" then begin + Ivar.fill_if_empty shard.ready () + end; + D.dispatch ~ev:t (Yojson.Safe.to_string data); + return { shard with + seq = seq; + session = session; + } + + let set_status ~(status:Yojson.Safe.json) shard = + let payload = match status with + | `Assoc [("name", `String name); ("type", `Int t)] -> + `Assoc [ + ("status", `String "online"); + ("afk", `Bool false); + ("since", `Null); + ("game", `Assoc [ + ("name", `String name); + ("type", `Int t) + ]) + ] + | `String name -> + `Assoc [ + ("status", `String "online"); + ("afk", `Bool false); + ("since", `Null); + ("game", `Assoc [ + ("name", `String name); + ("type", `Int 0) + ]) + ] + | _ -> raise Invalid_Payload + in + Ivar.read shard.ready >>= fun _ -> + push_frame ~payload ~ev:STATUS_UPDATE shard + + let request_guild_members ?(query="") ?(limit=0) ~guild shard = + let payload = `Assoc [ + ("guild_id", `String (Int.to_string guild)); + ("query", `String query); + ("limit", `Int limit); + ] in + Ivar.read shard.ready >>= fun _ -> + push_frame ~payload ~ev:REQUEST_GUILD_MEMBERS shard + + let initialize ?data shard = + let module J = Yojson.Safe.Util in + let hb = match shard.hb with + | None -> begin + match data with + | Some data -> + let hb_interval = J.(member "heartbeat_interval" data |> to_int) in + let stop_hb = Ivar.create () in + let stopper i = + Ivar.read stop_hb + >>> fun () -> + Ivar.fill_if_empty i () + in + let stop = Deferred.create stopper in + Clock.every' + ~continue_on_error:true + ~stop + (Core.Time.Span.create ~ms:hb_interval ()) + (fun () -> heartbeat shard >>= fun _ -> return ()); + stop_hb + | None -> raise Failure_to_Establish_Heartbeat + end + | Some s -> s + in + let shard = { shard with hb = Some hb; } in + let (cur, max) = shard.id in + let shards = [`Int cur; `Int max] in + match shard.session with + | None -> begin + Mutex.lock identify_lock; + let payload = `Assoc [ + ("token", `String token); + ("properties", `Assoc [ + ("$os", `String Sys.os_type); + ("$device", `String "dis.ml"); + ("$browser", `String "dis.ml") + ]); + ("compress", `Bool false); (* TODO add compression handling*) + ("large_threshold", `Int 250); + ("shard", `List shards); + ] in + push_frame ~payload ~ev:IDENTIFY shard + >>| fun s -> begin + Clock.after (Core.Time.Span.create ~sec:5 ()) + >>> (fun _ -> Mutex.unlock identify_lock); + s + end + end + | Some s -> + let payload = `Assoc [ + ("token", `String token); + ("session_id", `String s); + ("seq", `Int shard.seq) + ] in + push_frame ~payload ~ev:RESUME shard + + let handle_frame ~f shard = + let module J = Yojson.Safe.Util in + let op = J.(member "op" f |> to_int) + |> Opcode.from_int + in + match op with + | DISPATCH -> dispatch ~payload:f shard + | HEARTBEAT -> heartbeat shard + | INVALID_SESSION -> begin + if J.(member "d" f |> to_bool) then + initialize shard + else begin + initialize { shard with session = None; } + end + end + | RECONNECT -> initialize shard + | HELLO -> initialize ~data:(J.member "d" f) shard + | HEARTBEAT_ACK -> return shard + | opcode -> + print_endline @@ "Invalid Opcode: " ^ Opcode.to_string opcode; + return shard + + let rec make_client + ~initialized + ~extra_headers + ~app_to_ws + ~ws_to_app + ~net_to_ws + ~ws_to_net + uri = + client + ~initialized + ~extra_headers + ~app_to_ws + ~ws_to_app + ~net_to_ws + ~ws_to_net + uri + >>> fun res -> + match res with + | Ok () -> () + | Error _ -> + let backoff = Time.Span.create ~ms:500 () in + Clock.after backoff >>> (fun () -> + make_client + ~initialized + ~extra_headers + ~app_to_ws + ~ws_to_app + ~net_to_ws + ~ws_to_net + uri) + + + let create ~url ~shards () = + let open Core in + let uri = (url ^ "?v=6&encoding=json") |> Uri.of_string in + let extra_headers = H.Base.process_request_headers () in + let host = Option.value_exn ~message:"no host in uri" Uri.(host uri) in + let port = + match Uri.port uri, Uri_services.tcp_port_of_uri uri with + | Some p, _ -> p + | None, Some p -> p + | _ -> 443 in + let scheme = Option.value_exn ~message:"no scheme in uri" Uri.(scheme uri) in + let tcp_fun (net_to_ws, ws_to_net) = + let (app_to_ws, write) = Pipe.create () in + let (read, ws_to_app) = Pipe.create () in + let initialized = Ivar.create () in + make_client + ~initialized + ~extra_headers + ~app_to_ws + ~ws_to_app + ~net_to_ws + ~ws_to_net + uri; + Ivar.read initialized >>| fun () -> + { + pipe = (read, write); + ready = Ivar.create (); + hb = None; + seq = 0; + id = shards; + session = None; + url; + } + in + match Unix.getaddrinfo host (string_of_int port) [] with + | [] -> failwithf "DNS resolution failed for %s" host () + | { ai_addr; _ } :: _ -> + let addr = + match scheme, ai_addr with + | _, ADDR_UNIX path -> `Unix_domain_socket path + | "https", ADDR_INET (h, p) + | "wss", ADDR_INET (h, p) -> + let h = Ipaddr_unix.of_inet_addr h in + `OpenSSL (h, p, Conduit_async.V2.Ssl.Config.create ()) + | _, ADDR_INET (h, p) -> + let h = Ipaddr_unix.of_inet_addr h in + `TCP (h, p) + in + Conduit_async.V2.connect addr >>= tcp_fun + + let recreate shard = + print_endline "Reconnecting..."; + (match shard.hb with + | Some hb -> Ivar.fill_if_empty hb () + | None -> () + ); + create ~url:(shard.url) ~shards:(shard.id) () + end + + type t = { + shards: (Shard.shard Shard.t) list; + } + + let start ?count () = + let module J = Yojson.Safe.Util in + H.get_gateway_bot () >>= fun data -> + let url = J.(member "url" data |> to_string) in + let count = match count with + | Some c -> c + | None -> J.(member "shards" data |> to_int) + in + let shard_list = (0, count) in + let rec ev_loop (t:Shard.shard Shard.t) = + let (read, _) = t.state.pipe in + Pipe.read read + >>= fun frame -> + (match Shard.parse frame with + | Some f -> begin + Shard.handle_frame ~f t.state + >>| fun s -> (t.state <- s; t) + end + | None -> begin + Shard.recreate t.state + >>| fun s -> (t.state <- s; t) + end) + >>= fun t -> + List.iter ~f:(fun f -> f t.state) t.binds; + ev_loop t + in + let rec gen_shards l a = + match l with + | (id, total) when id >= total -> return a + | (id, total) -> + Shard.create ~url ~shards:(id, total) () + >>= fun shard -> + let t = Shard.{ state = shard; binds = []; } in + ev_loop t >>> ignore; + gen_shards (id+1, total) (t :: a) + in + gen_shards shard_list [] + >>| fun shards -> + { shards; } + + let set_status ~status sharder = + Deferred.all @@ List.map ~f:(fun t -> + Shard.set_status ~status t.state + ) sharder.shards + + let set_status_with ~f sharder = + Deferred.all @@ List.map ~f:(fun t -> + Shard.set_status ~status:(f t.state) t.state + ) sharder.shards + + let request_guild_members ?query ?limit ~guild sharder = + Deferred.all @@ List.map ~f:(fun t -> + Shard.request_guild_members ~guild ?query ?limit t.state + ) sharder.shards +end
\ No newline at end of file diff --git a/lib/sharder.mli b/lib/sharder.mli new file mode 100644 index 0000000..8d04c8d --- /dev/null +++ b/lib/sharder.mli @@ -0,0 +1 @@ +module Make(H : S.Http)(D : S.Dispatch) : S.Sharder
\ No newline at end of file |