use std::collections::BTreeSet; use jmap_proto::endpoints::session::CoreCapability; use uuid::Uuid; use crate::{ config::CoreCapabilities, extensions::{ router::ExtensionRouter, JmapEndpoint, JmapExtension, JmapSessionCapabilityExtension, }, }; #[derive(Clone)] pub struct Core { pub(crate) core_capabilities: CoreCapabilities, } impl JmapExtension for Core { const EXTENSION: &'static str = "urn:ietf:params:jmap:core"; fn router(&self) -> ExtensionRouter { ExtensionRouter::default().register(Echo) } } impl JmapSessionCapabilityExtension for Core { type Metadata = CoreCapability<'static>; fn build(&self, _user: Uuid) -> Self::Metadata { CoreCapability { max_size_upload: self.core_capabilities.max_size_upload.into(), max_concurrent_upload: self.core_capabilities.max_concurrent_upload.into(), max_size_request: self.core_capabilities.max_size_request.into(), max_concurrent_requests: self.core_capabilities.max_concurrent_requests.into(), max_calls_in_request: self.core_capabilities.max_calls_in_request.into(), max_objects_in_get: self.core_capabilities.max_objects_in_get.into(), max_objects_in_set: self.core_capabilities.max_objects_in_set.into(), collation_algorithms: BTreeSet::default(), } } } pub struct Echo; impl JmapEndpoint for Echo { type Parameters<'de> = &'de serde_json::value::RawValue; type Response<'s> = &'s serde_json::value::RawValue; const ENDPOINT: &'static str = "echo"; fn handle<'de>(&self, _extension: &Core, params: Self::Parameters<'de>) -> Self::Response<'de> { params } }