mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2025-09-11 07:33:01 +02:00
Post-formatting aesthetic and spacing corrections
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
af4f66c768
commit
364293608d
72 changed files with 704 additions and 528 deletions
|
@ -1,21 +1,27 @@
|
|||
mod content;
|
||||
mod filter;
|
||||
mod format;
|
||||
mod id;
|
||||
mod redact;
|
||||
mod relation;
|
||||
mod type_ext;
|
||||
mod unsigned;
|
||||
|
||||
use std::fmt::Debug;
|
||||
|
||||
use ruma::{
|
||||
EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, RoomId, RoomVersionId, UserId,
|
||||
events::TimelineEventType,
|
||||
CanonicalJsonObject, EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, RoomId,
|
||||
RoomVersionId, UserId, events::TimelineEventType,
|
||||
};
|
||||
use serde::Deserialize;
|
||||
use serde_json::{Value as JsonValue, value::RawValue as RawJsonValue};
|
||||
|
||||
pub use self::type_ext::TypeExt;
|
||||
use super::state_key::StateKey;
|
||||
use crate::Result;
|
||||
pub use self::{filter::Matches, id::*, relation::RelationTypeEqual, type_ext::TypeExt};
|
||||
use super::{pdu::Pdu, state_key::StateKey};
|
||||
use crate::{Result, utils};
|
||||
|
||||
/// Abstraction of a PDU so users can have their own PDU types.
|
||||
pub trait Event {
|
||||
pub trait Event: Clone + Debug {
|
||||
/// Serialize into a Ruma JSON format, consuming.
|
||||
#[inline]
|
||||
fn into_format<T>(self) -> T
|
||||
|
@ -36,6 +42,41 @@ pub trait Event {
|
|||
format::Ref(self).into()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn contains_unsigned_property<T>(&self, property: &str, is_type: T) -> bool
|
||||
where
|
||||
T: FnOnce(&JsonValue) -> bool,
|
||||
Self: Sized,
|
||||
{
|
||||
unsigned::contains_unsigned_property::<T, _>(self, property, is_type)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_unsigned_property<T>(&self, property: &str) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
Self: Sized,
|
||||
{
|
||||
unsigned::get_unsigned_property::<T, _>(self, property)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_unsigned_as_value(&self) -> JsonValue
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
unsigned::get_unsigned_as_value(self)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_unsigned<T>(&self) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
Self: Sized,
|
||||
{
|
||||
unsigned::get_unsigned::<T, _>(self)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_content_as_value(&self) -> JsonValue
|
||||
where
|
||||
|
@ -69,6 +110,39 @@ pub trait Event {
|
|||
redact::is_redacted(self)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn into_canonical_object(self) -> CanonicalJsonObject
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
utils::to_canonical_object(self.into_pdu()).expect("failed to create Value::Object")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn to_canonical_object(&self) -> CanonicalJsonObject {
|
||||
utils::to_canonical_object(self.as_pdu()).expect("failed to create Value::Object")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn into_value(self) -> JsonValue
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
serde_json::to_value(self.into_pdu()).expect("failed to create JSON Value")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn to_value(&self) -> JsonValue {
|
||||
serde_json::to_value(self.as_pdu()).expect("failed to create JSON Value")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn as_mut_pdu(&mut self) -> &mut Pdu { unimplemented!("not a mutable Pdu") }
|
||||
|
||||
fn as_pdu(&self) -> &Pdu;
|
||||
|
||||
fn into_pdu(self) -> Pdu;
|
||||
|
||||
fn is_owned(&self) -> bool;
|
||||
|
||||
//
|
||||
|
@ -76,7 +150,7 @@ pub trait Event {
|
|||
//
|
||||
|
||||
/// All the authenticating events for this event.
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_;
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_;
|
||||
|
||||
/// The event's content.
|
||||
fn content(&self) -> &RawJsonValue;
|
||||
|
@ -88,7 +162,7 @@ pub trait Event {
|
|||
fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch;
|
||||
|
||||
/// The events before this event.
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_;
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_;
|
||||
|
||||
/// If this event is a redaction event this is the event it redacts.
|
||||
fn redacts(&self) -> Option<&EventId>;
|
||||
|
|
93
src/core/matrix/event/filter.rs
Normal file
93
src/core/matrix/event/filter.rs
Normal file
|
@ -0,0 +1,93 @@
|
|||
use ruma::api::client::filter::{RoomEventFilter, UrlFilter};
|
||||
use serde_json::Value;
|
||||
|
||||
use super::Event;
|
||||
use crate::is_equal_to;
|
||||
|
||||
pub trait Matches<E: Event> {
|
||||
fn matches(&self, event: &E) -> bool;
|
||||
}
|
||||
|
||||
impl<E: Event> Matches<E> for &RoomEventFilter {
|
||||
#[inline]
|
||||
fn matches(&self, event: &E) -> bool {
|
||||
if !matches_sender(event, self) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !matches_room(event, self) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !matches_type(event, self) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !matches_url(event, self) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
fn matches_room<E: Event>(event: &E, filter: &RoomEventFilter) -> bool {
|
||||
if filter.not_rooms.iter().any(is_equal_to!(event.room_id())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(rooms) = filter.rooms.as_ref() {
|
||||
if !rooms.iter().any(is_equal_to!(event.room_id())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fn matches_sender<E: Event>(event: &E, filter: &RoomEventFilter) -> bool {
|
||||
if filter.not_senders.iter().any(is_equal_to!(event.sender())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(senders) = filter.senders.as_ref() {
|
||||
if !senders.iter().any(is_equal_to!(event.sender())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fn matches_type<E: Event>(event: &E, filter: &RoomEventFilter) -> bool {
|
||||
let kind = event.kind().to_cow_str();
|
||||
|
||||
if filter.not_types.iter().any(is_equal_to!(&kind)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(types) = filter.types.as_ref() {
|
||||
if !types.iter().any(is_equal_to!(&kind)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fn matches_url<E: Event>(event: &E, filter: &RoomEventFilter) -> bool {
|
||||
let Some(url_filter) = filter.url_filter.as_ref() else {
|
||||
return true;
|
||||
};
|
||||
|
||||
//TODO: might be better to use Ruma's Raw rather than serde here
|
||||
let url = event
|
||||
.get_content_as_value()
|
||||
.get("url")
|
||||
.is_some_and(Value::is_string);
|
||||
|
||||
match url_filter {
|
||||
| UrlFilter::EventsWithUrl => url,
|
||||
| UrlFilter::EventsWithoutUrl => !url,
|
||||
}
|
||||
}
|
28
src/core/matrix/event/relation.rs
Normal file
28
src/core/matrix/event/relation.rs
Normal file
|
@ -0,0 +1,28 @@
|
|||
use ruma::events::relation::RelationType;
|
||||
use serde::Deserialize;
|
||||
|
||||
use super::Event;
|
||||
|
||||
pub trait RelationTypeEqual<E: Event> {
|
||||
fn relation_type_equal(&self, event: &E) -> bool;
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
struct ExtractRelatesToEventId {
|
||||
#[serde(rename = "m.relates_to")]
|
||||
relates_to: ExtractRelType,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
struct ExtractRelType {
|
||||
rel_type: RelationType,
|
||||
}
|
||||
|
||||
impl<E: Event> RelationTypeEqual<E> for RelationType {
|
||||
fn relation_type_equal(&self, event: &E) -> bool {
|
||||
event
|
||||
.get_content()
|
||||
.map(|c: ExtractRelatesToEventId| c.relates_to.rel_type)
|
||||
.is_ok_and(|r| r == *self)
|
||||
}
|
||||
}
|
51
src/core/matrix/event/unsigned.rs
Normal file
51
src/core/matrix/event/unsigned.rs
Normal file
|
@ -0,0 +1,51 @@
|
|||
use serde::Deserialize;
|
||||
use serde_json::value::Value as JsonValue;
|
||||
|
||||
use super::Event;
|
||||
use crate::{Result, err, is_true};
|
||||
|
||||
pub(super) fn contains_unsigned_property<F, E>(event: &E, property: &str, is_type: F) -> bool
|
||||
where
|
||||
F: FnOnce(&JsonValue) -> bool,
|
||||
E: Event,
|
||||
{
|
||||
get_unsigned_as_value(event)
|
||||
.get(property)
|
||||
.map(is_type)
|
||||
.is_some_and(is_true!())
|
||||
}
|
||||
|
||||
pub(super) fn get_unsigned_property<T, E>(event: &E, property: &str) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
E: Event,
|
||||
{
|
||||
get_unsigned_as_value(event)
|
||||
.get_mut(property)
|
||||
.map(JsonValue::take)
|
||||
.map(serde_json::from_value)
|
||||
.ok_or(err!(Request(NotFound("property not found in unsigned object"))))?
|
||||
.map_err(|e| err!(Database("Failed to deserialize unsigned.{property} into type: {e}")))
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub(super) fn get_unsigned_as_value<E>(event: &E) -> JsonValue
|
||||
where
|
||||
E: Event,
|
||||
{
|
||||
get_unsigned::<JsonValue, E>(event).unwrap_or_default()
|
||||
}
|
||||
|
||||
pub(super) fn get_unsigned<T, E>(event: &E) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
E: Event,
|
||||
{
|
||||
event
|
||||
.unsigned()
|
||||
.as_ref()
|
||||
.map(|raw| raw.get())
|
||||
.map(serde_json::from_str)
|
||||
.ok_or(err!(Request(NotFound("\"unsigned\" property not found in pdu"))))?
|
||||
.map_err(|e| err!(Database("Failed to deserialize \"unsigned\" into value: {e}")))
|
||||
}
|
|
@ -1,12 +1,8 @@
|
|||
mod builder;
|
||||
mod content;
|
||||
mod count;
|
||||
mod event_id;
|
||||
mod filter;
|
||||
mod id;
|
||||
mod raw_id;
|
||||
mod redact;
|
||||
mod relation;
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
mod unsigned;
|
||||
|
@ -24,7 +20,6 @@ pub use self::{
|
|||
Count as PduCount, Id as PduId, Pdu as PduEvent, RawId as RawPduId,
|
||||
builder::{Builder, Builder as PduBuilder},
|
||||
count::Count,
|
||||
event_id::*,
|
||||
id::{ShortId, *},
|
||||
raw_id::*,
|
||||
};
|
||||
|
@ -91,7 +86,7 @@ impl Pdu {
|
|||
|
||||
impl Event for Pdu {
|
||||
#[inline]
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_ {
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_ {
|
||||
self.auth_events.iter().map(AsRef::as_ref)
|
||||
}
|
||||
|
||||
|
@ -107,7 +102,7 @@ impl Event for Pdu {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_ {
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_ {
|
||||
self.prev_events.iter().map(AsRef::as_ref)
|
||||
}
|
||||
|
||||
|
@ -129,13 +124,22 @@ impl Event for Pdu {
|
|||
#[inline]
|
||||
fn unsigned(&self) -> Option<&RawJsonValue> { self.unsigned.as_deref() }
|
||||
|
||||
#[inline]
|
||||
fn as_mut_pdu(&mut self) -> &mut Pdu { self }
|
||||
|
||||
#[inline]
|
||||
fn as_pdu(&self) -> &Pdu { self }
|
||||
|
||||
#[inline]
|
||||
fn into_pdu(self) -> Pdu { self }
|
||||
|
||||
#[inline]
|
||||
fn is_owned(&self) -> bool { true }
|
||||
}
|
||||
|
||||
impl Event for &Pdu {
|
||||
#[inline]
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_ {
|
||||
fn auth_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_ {
|
||||
self.auth_events.iter().map(AsRef::as_ref)
|
||||
}
|
||||
|
||||
|
@ -151,7 +155,7 @@ impl Event for &Pdu {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Send + '_ {
|
||||
fn prev_events(&self) -> impl DoubleEndedIterator<Item = &EventId> + Clone + Send + '_ {
|
||||
self.prev_events.iter().map(AsRef::as_ref)
|
||||
}
|
||||
|
||||
|
@ -173,6 +177,12 @@ impl Event for &Pdu {
|
|||
#[inline]
|
||||
fn unsigned(&self) -> Option<&RawJsonValue> { self.unsigned.as_deref() }
|
||||
|
||||
#[inline]
|
||||
fn as_pdu(&self) -> &Pdu { self }
|
||||
|
||||
#[inline]
|
||||
fn into_pdu(self) -> Pdu { self.clone() }
|
||||
|
||||
#[inline]
|
||||
fn is_owned(&self) -> bool { false }
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
use serde::Deserialize;
|
||||
use serde_json::value::Value as JsonValue;
|
||||
|
||||
use crate::{Result, err, implement};
|
||||
|
||||
#[must_use]
|
||||
#[implement(super::Pdu)]
|
||||
pub fn get_content_as_value(&self) -> JsonValue {
|
||||
self.get_content()
|
||||
.expect("pdu content must be a valid JSON value")
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
pub fn get_content<T>(&self) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
{
|
||||
serde_json::from_str(self.content.get())
|
||||
.map_err(|e| err!(Database("Failed to deserialize pdu content into type: {e}")))
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
use ruma::api::client::filter::{RoomEventFilter, UrlFilter};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::{implement, is_equal_to};
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
#[must_use]
|
||||
pub fn matches(&self, filter: &RoomEventFilter) -> bool {
|
||||
if !self.matches_sender(filter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !self.matches_room(filter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !self.matches_type(filter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !self.matches_url(filter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
fn matches_room(&self, filter: &RoomEventFilter) -> bool {
|
||||
if filter.not_rooms.contains(&self.room_id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(rooms) = filter.rooms.as_ref() {
|
||||
if !rooms.contains(&self.room_id) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
fn matches_sender(&self, filter: &RoomEventFilter) -> bool {
|
||||
if filter.not_senders.contains(&self.sender) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(senders) = filter.senders.as_ref() {
|
||||
if !senders.contains(&self.sender) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
fn matches_type(&self, filter: &RoomEventFilter) -> bool {
|
||||
let event_type = &self.kind.to_cow_str();
|
||||
if filter.not_types.iter().any(is_equal_to!(event_type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if let Some(types) = filter.types.as_ref() {
|
||||
if !types.iter().any(is_equal_to!(event_type)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
fn matches_url(&self, filter: &RoomEventFilter) -> bool {
|
||||
let Some(url_filter) = filter.url_filter.as_ref() else {
|
||||
return true;
|
||||
};
|
||||
|
||||
//TODO: might be better to use Ruma's Raw rather than serde here
|
||||
let url = serde_json::from_str::<Value>(self.content.get())
|
||||
.expect("parsing content JSON failed")
|
||||
.get("url")
|
||||
.is_some_and(Value::is_string);
|
||||
|
||||
match url_filter {
|
||||
| UrlFilter::EventsWithUrl => url,
|
||||
| UrlFilter::EventsWithoutUrl => !url,
|
||||
}
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
use ruma::{RoomVersionId, canonical_json::redact_content_in_place};
|
||||
use serde_json::{json, value::to_raw_value};
|
||||
use serde_json::{Value as JsonValue, json, value::to_raw_value};
|
||||
|
||||
use crate::{Error, Result, err, implement};
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
pub fn redact(&mut self, room_version_id: &RoomVersionId, reason: &Self) -> Result {
|
||||
pub fn redact(&mut self, room_version_id: &RoomVersionId, reason: JsonValue) -> Result {
|
||||
self.unsigned = None;
|
||||
|
||||
let mut content = serde_json::from_str(self.content.get())
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
use ruma::events::relation::RelationType;
|
||||
use serde::Deserialize;
|
||||
|
||||
use crate::implement;
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
struct ExtractRelType {
|
||||
rel_type: RelationType,
|
||||
}
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
struct ExtractRelatesToEventId {
|
||||
#[serde(rename = "m.relates_to")]
|
||||
relates_to: ExtractRelType,
|
||||
}
|
||||
|
||||
#[implement(super::Pdu)]
|
||||
#[must_use]
|
||||
pub fn relation_type_equal(&self, rel_type: &RelationType) -> bool {
|
||||
self.get_content()
|
||||
.map(|c: ExtractRelatesToEventId| c.relates_to.rel_type)
|
||||
.is_ok_and(|r| r == *rel_type)
|
||||
}
|
|
@ -1,11 +1,10 @@
|
|||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma::MilliSecondsSinceUnixEpoch;
|
||||
use serde::Deserialize;
|
||||
use serde_json::value::{RawValue as RawJsonValue, Value as JsonValue, to_raw_value};
|
||||
|
||||
use super::Pdu;
|
||||
use crate::{Result, err, implement, is_true};
|
||||
use crate::{Result, err, implement};
|
||||
|
||||
#[implement(Pdu)]
|
||||
pub fn remove_transaction_id(&mut self) -> Result {
|
||||
|
@ -74,43 +73,3 @@ pub fn add_relation(&mut self, name: &str, pdu: Option<&Pdu>) -> Result {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[implement(Pdu)]
|
||||
pub fn contains_unsigned_property<F>(&self, property: &str, is_type: F) -> bool
|
||||
where
|
||||
F: FnOnce(&JsonValue) -> bool,
|
||||
{
|
||||
self.get_unsigned_as_value()
|
||||
.get(property)
|
||||
.map(is_type)
|
||||
.is_some_and(is_true!())
|
||||
}
|
||||
|
||||
#[implement(Pdu)]
|
||||
pub fn get_unsigned_property<T>(&self, property: &str) -> Result<T>
|
||||
where
|
||||
T: for<'de> Deserialize<'de>,
|
||||
{
|
||||
self.get_unsigned_as_value()
|
||||
.get_mut(property)
|
||||
.map(JsonValue::take)
|
||||
.map(serde_json::from_value)
|
||||
.ok_or(err!(Request(NotFound("property not found in unsigned object"))))?
|
||||
.map_err(|e| err!(Database("Failed to deserialize unsigned.{property} into type: {e}")))
|
||||
}
|
||||
|
||||
#[implement(Pdu)]
|
||||
#[must_use]
|
||||
pub fn get_unsigned_as_value(&self) -> JsonValue {
|
||||
self.get_unsigned::<JsonValue>().unwrap_or_default()
|
||||
}
|
||||
|
||||
#[implement(Pdu)]
|
||||
pub fn get_unsigned<T>(&self) -> Result<JsonValue> {
|
||||
self.unsigned
|
||||
.as_ref()
|
||||
.map(|raw| raw.get())
|
||||
.map(serde_json::from_str)
|
||||
.ok_or(err!(Request(NotFound("\"unsigned\" property not found in pdu"))))?
|
||||
.map_err(|e| err!(Database("Failed to deserialize \"unsigned\" into value: {e}")))
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ type Result<T, E = Error> = crate::Result<T, E>;
|
|||
/// event is part of the same room.
|
||||
//#[tracing::instrument(level = "debug", skip(state_sets, auth_chain_sets,
|
||||
//#[tracing::instrument(level event_fetch))]
|
||||
pub async fn resolve<'a, E, Sets, SetIter, Hasher, Fetch, FetchFut, Exists, ExistsFut>(
|
||||
pub async fn resolve<'a, Pdu, Sets, SetIter, Hasher, Fetch, FetchFut, Exists, ExistsFut>(
|
||||
room_version: &RoomVersionId,
|
||||
state_sets: Sets,
|
||||
auth_chain_sets: &'a [HashSet<OwnedEventId, Hasher>],
|
||||
|
@ -83,14 +83,14 @@ pub async fn resolve<'a, E, Sets, SetIter, Hasher, Fetch, FetchFut, Exists, Exis
|
|||
) -> Result<StateMap<OwnedEventId>>
|
||||
where
|
||||
Fetch: Fn(OwnedEventId) -> FetchFut + Sync,
|
||||
FetchFut: Future<Output = Option<E>> + Send,
|
||||
FetchFut: Future<Output = Option<Pdu>> + Send,
|
||||
Exists: Fn(OwnedEventId) -> ExistsFut + Sync,
|
||||
ExistsFut: Future<Output = bool> + Send,
|
||||
Sets: IntoIterator<IntoIter = SetIter> + Send,
|
||||
SetIter: Iterator<Item = &'a StateMap<OwnedEventId>> + Clone + Send,
|
||||
Hasher: BuildHasher + Send + Sync,
|
||||
E: Event + Clone + Send + Sync,
|
||||
for<'b> &'b E: Event + Send,
|
||||
Pdu: Event + Clone + Send + Sync,
|
||||
for<'b> &'b Pdu: Event + Send,
|
||||
{
|
||||
debug!("State resolution starting");
|
||||
|
||||
|
@ -221,6 +221,7 @@ where
|
|||
|
||||
let state_sets_iter =
|
||||
state_sets_iter.inspect(|_| state_set_count = state_set_count.saturating_add(1));
|
||||
|
||||
for (k, v) in state_sets_iter.flatten() {
|
||||
occurrences
|
||||
.entry(k)
|
||||
|
@ -305,6 +306,7 @@ where
|
|||
let pl = get_power_level_for_sender(&event_id, fetch_event)
|
||||
.await
|
||||
.ok()?;
|
||||
|
||||
Some((event_id, pl))
|
||||
})
|
||||
.inspect(|(event_id, pl)| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue