// pub fn filter_room_events<'i, I: Iterator>>( // events: I, // sender_user: &UserId, // sender_device: &DeviceId, // room_id: Option<&RoomId>, // filter: RoomEventFilter, // ) -> crate::Result>>> { // let (lazy_load_enabled, lazy_load_send_redundant) = match &filter.lazy_load_options { // LazyLoadOptions::Enabled { // include_redundant_members, // } => (true, *include_redundant_members), // _ => (false, false), // }; // let it = Box::new( // events // .filter(|event| match &filter.rooms { // None => true, // Some(rooms) => rooms.iter().any(|r| { // r.as_str() // == event // .get_field::("room_id") // .expect("room events should deserialize") // .expect("room events should have a room_id") // }), // }) // .filter(|event| match &filter.not_rooms[..] { // [] => true, // not_rooms => not_rooms.iter().all(|r| { // r.as_str() // != event // .get_field::("room_id") // .expect("room events should deserialize") // .expect("room events should have a room_id") // }), // }) // .filter(|event| match &filter.senders { // None => true, // Some(rooms) => rooms.iter().any(|r| { // r.as_str() // == event // .get_field::("sender") // .expect("room events should deserialize") // .expect("room events should have a sender") // }), // }) // .filter(|event| match &filter.not_senders[..] { // [] => true, // not_senders => not_senders.iter().all(|r| { // r.as_str() // != event // .get_field::("sender") // .expect("room events should deserialize") // .expect("room events should have a sender") // }), // }) // .filter(|event| match &filter.types { // None => true, // Some(types) => types.iter().any(|t| { // t.as_str() // == event // .get_field::("type") // .expect("room events should deserialize") // .expect("room events should have a type") // }), // }) // .filter(|event| match &filter.not_types[..] { // [] => true, // not_types => not_types.iter().all(|t| { // t.as_str() // != event // .get_field::("type") // .expect("room events should deserialize") // .expect("room events should have a type") // }), // }) // .filter(|event| { // let room_id = event // .get_field::("room_id") // .expect("room events should deserialize") // .expect("room events should have a room_id"); // let event_id = event // .get_field::("event_id") // .expect("room events should deserialize") // .expect("room events should have an event_id"); // services() // .rooms // .state_accessor // .user_can_see_event(sender_user, &room_id, &event_id) // .unwrap_or(false) // }), // ); // let memberships = it // .map(|event| { // let room_id = event // .get_field::("room_id") // .expect("room events should deserialize") // .expect("room events should have a room_id"); // let sender = event // .get_field::("sender") // .expect("room events should deserialize") // .expect("room events should have a sender"); // (room_id, sender) // }) // .flat_map(|(room_id, sender)| { // services() // .rooms // .lazy_loading // .lazy_load_was_sent_before(sender_user, sender_device, &room_id, &sender) // .map(|b| { // if !b || lazy_load_send_redundant { // Some(sender) // } else { // None // } // }) // .transpose() // }) // .collect::>>()?; // Ok(it) // } use serde_json::Value; pub fn event_fields>(mut json: Value, event_fields: I) -> Value { let inner = json .as_object_mut() .expect("PduEvent should always be an object"); // TODO: testing this properly for field in event_fields { let mut paths = field.split('.').peekable(); let mut parent = &mut *inner; while let Some(key) = paths.next() { if paths.peek().is_none() { parent.remove(key); } else { parent = parent .get_mut(key) .map(Value::as_object_mut) .flatten() .unwrap(); } } } json }