(** JMAP Capability URNs Capabilities define which parts of JMAP are supported. They appear in the Session object's "capabilities" property and in Request "using" arrays. Reference: RFC 8620 Section 2 Test files: test/data/core/session.json (capabilities field) *) (** Abstract type for capability URNs *) type t = string (** Core JMAP capability (RFC 8620) *) let core = "urn:ietf:params:jmap:core" (** JMAP Mail capability (RFC 8621) *) let mail = "urn:ietf:params:jmap:mail" (** JMAP Mail submission capability (RFC 8621) *) let submission = "urn:ietf:params:jmap:submission" (** JMAP Vacation response capability (RFC 8621) *) let vacation_response = "urn:ietf:params:jmap:vacationresponse" (** Create a capability from a URN string *) let of_string s = s (** Convert capability to URN string *) let to_string t = t (** Parse from JSON *) let of_json = function | `String s -> of_string s | _ -> raise (Jmap_error.Parse_error "Capability must be a JSON string") (** Convert to JSON *) let to_json t = `String t (** Check if a capability is supported *) let is_supported t = t = core || t = mail || t = submission || t = vacation_response module CoreCapability = struct (** Core capability properties (RFC 8620 Section 2) *) type t = { max_size_upload : int; max_concurrent_upload : int; max_size_request : int; max_concurrent_requests : int; max_calls_in_request : int; max_objects_in_get : int; max_objects_in_set : int; collation_algorithms : string list; } (** Accessors *) let max_size_upload t = t.max_size_upload let max_concurrent_upload t = t.max_concurrent_upload let max_size_request t = t.max_size_request let max_concurrent_requests t = t.max_concurrent_requests let max_calls_in_request t = t.max_calls_in_request let max_objects_in_get t = t.max_objects_in_get let max_objects_in_set t = t.max_objects_in_set let collation_algorithms t = t.collation_algorithms (** Constructor *) let v ~max_size_upload ~max_concurrent_upload ~max_size_request ~max_concurrent_requests ~max_calls_in_request ~max_objects_in_get ~max_objects_in_set ~collation_algorithms = { max_size_upload; max_concurrent_upload; max_size_request; max_concurrent_requests; max_calls_in_request; max_objects_in_get; max_objects_in_set; collation_algorithms } (** Parse from JSON. Test files: test/data/core/session.json *) let of_json _json = (* TODO: Implement JSON parsing *) raise (Jmap_error.Parse_error "CoreCapability.of_json not yet implemented") let to_json _t = (* TODO: Implement JSON serialization *) raise (Jmap_error.Parse_error "CoreCapability.to_json not yet implemented") end module MailCapability = struct (** Mail capability properties (RFC 8621 Section 1.1) *) type t = { max_mailboxes_per_email : int option; max_mailbox_depth : int option; max_size_mailbox_name : int; max_size_attachments_per_email : int; email_query_sort_options : string list; may_create_top_level_mailbox : bool; } (** Accessors *) let max_mailboxes_per_email t = t.max_mailboxes_per_email let max_mailbox_depth t = t.max_mailbox_depth let max_size_mailbox_name t = t.max_size_mailbox_name let max_size_attachments_per_email t = t.max_size_attachments_per_email let email_query_sort_options t = t.email_query_sort_options let may_create_top_level_mailbox t = t.may_create_top_level_mailbox (** Constructor *) let v ?max_mailboxes_per_email ?max_mailbox_depth ~max_size_mailbox_name ~max_size_attachments_per_email ~email_query_sort_options ~may_create_top_level_mailbox () = { max_mailboxes_per_email; max_mailbox_depth; max_size_mailbox_name; max_size_attachments_per_email; email_query_sort_options; may_create_top_level_mailbox } (** Parse from JSON. Test files: test/data/core/session.json *) let of_json _json = (* TODO: Implement JSON parsing *) raise (Jmap_error.Parse_error "MailCapability.of_json not yet implemented") let to_json _t = (* TODO: Implement JSON serialization *) raise (Jmap_error.Parse_error "MailCapability.to_json not yet implemented") end