use std::collections::HashMap; use serde::Deserialize; use serde_json::{value::RawValue, Value}; use crate::extensions::{JmapEndpoint, JmapExtension, ResolvedArguments}; pub struct ExtensionRouter { routes: HashMap<&'static str, Box + Send + Sync>>, } impl ExtensionRouter { pub fn register + Send + Sync + 'static>(mut self, endpoint: E) -> Self { self.routes.insert(E::ENDPOINT, Box::new(endpoint)); self } pub fn handle( &self, extension: &Ext, method: &str, params: ResolvedArguments<'_>, ) -> Option> { Some(self.routes.get(method)?.handle(extension, params)) } } impl Default for ExtensionRouter { fn default() -> Self { Self { routes: HashMap::new(), } } } trait ErasedJmapEndpoint { fn handle(&self, endpoint: &Ext, params: ResolvedArguments<'_>) -> HashMap; } impl> ErasedJmapEndpoint for E { fn handle(&self, endpoint: &Ext, params: ResolvedArguments<'_>) -> HashMap { let res = >::handle( self, endpoint, Deserialize::deserialize(params).unwrap(), ); serde_json::from_value(serde_json::to_value(res).unwrap()).unwrap() } }